检查枚举值,然后添加另一个字段(Java)

时间:2019-02-10 14:00:55

标签: java enums field

我在Java中有一个名为Course的课程。在该课程中,我有一些专用字段(ID,名称,教师列表和枚举类型(可以是必修,选修或模块化))。如果课程类型为“模块化”,则应该有另一个字段“模块”。怎么能以不同的方式做到(不要设置3个不同的必修课,选修课和模块化课)?

5 个答案:

答案 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;}
    }