从枚举到文本文件中的动态值

如何解决从枚举到文本文件中的动态值

在这里遇到了麻烦。我有很多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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?