如何解决从枚举到文本文件中的动态值
我在这里遇到了麻烦。我有很多Java代码,其中包含数百个类和一些项目。我在这段代码中有一个工作枚举。
public enum Jobtype {
Teacher,Driver,Nurse,Waiter,Businessman,Electrican
}
此枚举在代码中的数十个地方使用。 Job currentjob = Job.Waiter;
等。现在我想拥有动态工作。通过从包含不同作业的文本文件中读取,然后在运行时将作业从文本文件添加到ArrayList中。那意味着我不能再有枚举了,因为枚举中的工作可以更改(可能只包含“ engineer”和“ Cook”工作)。所以我需要更改代码。我当时正在考虑创建一个名为Job的新类。
public class Job{
private String Job = "";
public Job(String Job) {
this.Job= Job;
}
public String getJob() {
return Job;
}
public void setJob(String Job) {
this.Job = Job;
}
}
然后创建一个新的arraylist<Job> job = new Arraylist<Job>;
并根据输入添加新的作业。但是,这意味着如果删除枚举类型,我将在整个代码中收到错误。而且我无法更改代码中的每个位置。有什么方法可以使用数组或任何其他类型的动态代码,使用户可以在运行时添加新作业而不是枚举,而无需我更改所有这些位置?
例如,有类似的功能:
public void(String name,Jobtype job) {
if (job != Jobtype.Doctor) {
System.out.print("%s is Not a doctor" + name);
}
}
如您所见,这些类型的函数具有枚举类型 “ Jobtype”作为参数。如果删除枚举,则所有具有相似参数的函数都会出错。这意味着我需要在许多地方更改无效的代码。我需要某种解决方案。
谢谢!
解决方法
您将您的枚举称为Jobs
;这是一个常见错误,应该是Job
。幸运的是,任何流行的IDE(Eclipse,intellij和netbeans都可以做到这一点)可以在这里轻松地重构整个代码库:使用“ rename”重构脚本对其进行重命名,该工具将一口气为您重命名所有代码。 / p>
然后,您可以用一个类替换该枚举,但保留“硬编码”角色。但是,为确保==
样式相等性继续起作用,您必须确保 {>} Job
的构造函数为私有。
public class Job {
private final String job;
private static final Map<String,Job> cache = new HashMap<>();
private Job(String job) {
this.job = job;
}
public static Job of(String job) {
return cache.computeIfAbsent(job,j -> new Job(j));
}
public static final Job Doctor = of("Doctor");
// repeat for all your existing enum values.
}
到那时,您仍然可以编写Job.Doctor
,甚至可以写Job.Doctor == Job.of("Doctor")
,所有内容都将继续工作。您可以省略此答案顶部描述的重构,但是类型有误。
注意:此类最终将开始泄漏内存,但前提是您发明了成千上万的职位。请注意,如果它在公共站点上运行,则可能是真正的小丑并编写了脚本,但是如果没有这种滥用,这将不是问题。如果这是一个问题,那么更复杂的重构可能是您唯一的解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。