java – 使用Enum来保存对象常量

所以我最近学到了很多东西,所以我要回过头来修改以前的课程中的作业,我用它来实现它们的良好实践.一个功课让我们实现了一个包含一系列Course对象的Planner对象.我正在尝试创建一些课程常量,以便我可以访问一些流行的课程,而无需每次都创建全新的对象,因此我可以轻松访问它们而无需经过课程构建过程.我对枚举没有多少经验,我似乎无法找到任何关于如何实际使用Enum来存储对象的常量的东西.我原本想在Course类中使它们成为常量,但在这种情况下应该使用Effective Java坚持列.我的实施是否有意义?我应该如何制作包含课程常量的枚举,以便我可以实际检索它们?我使用Builder方法创建课程.

public enum Courses {
    CSE_114, CSE_214, CSE_219, CSE_215;

    private final static Course CSE_114_COURSE = new Course
        .Builder("Computer Science 1", "Paul Fodor", 114)
        .section((byte)1).department("CSE").build();

    private static final Course CSE_214_COURSE = new Course
        .Builder("Data Structures", "Ahmad Esmaili", 214)
        .section((byte)1).department("CSE").build();

    private static final Course CSE_219_COURSE = new Course
        .Builder("Software Development", "Richard McKenna", 219)
        .section((byte)1).department("CSE").build();

    private static final Course CSE_215_COURSE = new Course
        .Builder("Foundations of CS", "Paul Fodor", 215)
        .section((byte)1).department("CSE").build();

    public static Course get(Courses c) {
        switch(c) {
            case CSE_114: return CSE_114_COURSE;
            case CSE_214: return CSE_214_COURSE;
            case CSE_219: return CSE_219_COURSE;
            case CSE_215: return CSE_215_COURSE;
            default: throw new IllegalArgumentException("Course does not exist.");
    }
}
}

解决方法:

您实际上可以将枚举视为对象:

public enum Course {
    CSE_114("Computer Science 1", "Paul Fodor");

    public final String room;
    public final String lecturer;

    private Course(room, lecturer) {
        this.room = room;
        this.lecturer = lecturer;
    }
}

因为它是枚举,所以在编译时必须知道所有值.这由Java语言强制执行,这要求枚举构造函数是私有的.

虽然这对你的情况有用,但我不推荐它 – 事实上,我不建议使用枚举.枚举表示固定的已知值集.如果要在运行时创建更多课程,则枚举不完整,这与枚举的定义相矛盾.

相反,我建议你使用CourseManager.创建一个类,其中包含所有已知课程的集合.然后,当您需要课程时,您可以按名称申请.

Course cs114 = courses.get("CS 114");

您还可以通过从文件中实例化CourseManager来更进一步,该文件包含基本格式(如JSON)的课程列表.

上一篇:java – 在类或接口中声明常量的更好的地方是什么?


下一篇:java – 最终变量赋值:在声明或构造函数中?