使用Enum来保存对象常量

时间:2016-02-06 19:47:07

标签: java enums constants

所以我最近学到了很多东西,所以我要回过头来修改我之前使用优秀实践实现它们的课程中的作业。一个功课让我们实现了一个包含一系列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.");
    }
}
}

3 个答案:

答案 0 :(得分:5)

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

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)的课程列表。

答案 1 :(得分:1)

这不是一个糟糕的实现,但我认为有一个更好的解决方案:在你的枚举定义中添加一个抽象方法。

public enum Courses {
    CSE_114 {
        public Course getCourse() {
            return CSE_114_COURSE;
        }
    }
    ...

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

    ...

    public abstract Course getCourse();

}

这样你可以访问任何课程对象víaCourses.CSE_114.getCourse(),你也强迫每个enum都有一个课程(想象你添加了一个枚举常量但是忘了在get方法中添加它我提出的方式使这种情况无意义

答案 2 :(得分:1)

您正在使用静态常量混合枚举常量。从enum课程中获取这些课程和课程选择。或者你可以使用像Andrew Williamson这样的东西。只是不要将静态常量与枚举混合在一起。静态常量不属于枚举类。枚举类具有一组固定的值,这是其角色结束的地方。使用这些枚举的所有其他逻辑应该在其他地方完成