Проверьте значение перечисления, а затем добавьте другое поле (Java) - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть класс на Java с именем Course.В этом классе у меня есть несколько закрытых полей (ID, имя, список преподавателей и тип enum (которые могут быть обязательными, факультативными или модульными)).Если тип курса Модульный, должно быть другое поле Модуль.Как это можно сделать по-другому (не иметь 3 разных классов CompulsoryCourse, ElectiveCourse и ModularCourse)?

Ответы [ 5 ]

0 голосов
/ 11 февраля 2019

используйте тот факт, что перечисления являются объектами.Добавьте приватное поле 'module' и метод '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;}
    }
0 голосов
/ 10 февраля 2019
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
    }
}
0 голосов
/ 10 февраля 2019

Это похоже на шаблон Factory или Strategy .Однако для этого требуется полиморфизм.
Динамическое добавление поля в класс невозможно или, что лучше, но это тема манипуляции с байт-кодом.

Вы можете эмулировать необязательность поля типа Module,инкапсулируя его и выставляя его с помощью метода Optional<Module> getter, или применяя к нему своего рода реализацию no-op.

0 голосов
/ 10 февраля 2019

Кроме использования null или аналогичного ...

Вместо использования перечисления для type используйте тип.

abstract class CourseType {
    ...
}
class Modular extends CourseType {
    private Module module;
    ...
}
class Compulsory extends CourseType {
...
class Course {
    private CourseType type;
0 голосов
/ 10 февраля 2019

Ну, у вас может быть дополнительное поле Module, которое не является обязательным.Таким образом, это будет null, а его метод получения возвращает Optional<Module> (таким образом вы избежите исключений нулевого указателя).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...