我在Java中有一个名为Course的课程。在该课程中,我有一些专用字段(ID,名称,教师列表和枚举类型(可以是必修,选修或模块化))。如果课程类型为“模块化”,则应该有另一个字段“模块”。怎么能以不同的方式做到(不要设置3个不同的必修课,选修课和模块化课)?
答案 0 :(得分:0)
那么您可以有一个额外的字段Module
,该字段是可选的。因此它将是null
,它的getter返回Optional<Module>
(这样可以避免空指针异常)。
答案 1 :(得分:0)
这似乎是 Factory 或 Strategy 模式的一种情况。但是,这需要多态性。
动态地向类添加字段是不可能的,或者更好的做法是,但这是字节码操作的主题。
您可以模拟Module
类型字段的可选性,方法是将其封装并通过Optional<Module>
getter方法公开,或对其应用某种no-op
实现。 / p>
答案 2 :(得分:0)
除了使用null
或类似的内容...
使用类型而不是对type
使用枚举。
abstract class CourseType {
...
}
class Modular extends CourseType {
private Module module;
...
}
class Compulsory extends CourseType {
...
class Course {
private CourseType type;
答案 3 :(得分:0)
public class Course {
private UUID ID;
private String name;
private List<String> teachers;
private Type type;
private String module;
public void typeCompulsory() {
type(Type.COMPULSORY, null);
}
public void typeElective() {
type(Type.ELECTIVE, null);
}
public void typeModular(String module) {
Objects.requireNonNull(module);
type(Type.MODULAR, module);
}
private void type(Type type, String module) {
this.type = type;
this.module = module;
}
public enum Type {
COMPULSORY,
ELECTIVE,
MODULAR
}
}
答案 4 :(得分:0)
使用枚举是对象这一事实。添加一个专用字段“模块”和一个方法“ getModule”,该方法将返回模块化课程的模块值,而对于必修和选修课程则返回null。
enum courseType{
Modular("module x"), Compulsory, Elective;
private String module = null;
private courseType(){}
private courseType(String module){this.module = module;}
public String getModule() {return this.module;}
}
您也可以抛出异常:
enum courseType{
Modular("module x"),
Compulsory {public String getModule() { throw new AssertionError("not applicable");}},
Elective {public String getModule() { throw new AssertionError("not applicable");}};
private final String module;
private courseType(){ this.module = null;}
private courseType(String module){this.module = module;}
public String getModule() { return this.module;}
}