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