Альтернатива множественным конструкторам

У меня есть этот конструктор...

public ShiftLog(String companyName, boolean workedForAgent, String agentName,
                    Date shiftStart, Date shiftEnd,
                    boolean breakTaken, Date breakStart,
                    Date breakEnd, boolean isTransportJob,
                    String transportCompanyName, String vehicleRegistration) {
        this.userUid = FirebaseAuth.getInstance().getCurrentUser().getUid();
        this.companyName = companyName;
        this.workedForAgent = workedForAgent;
        this.agentName = agentName;
        this.shiftStart = shiftStart;
        this.shiftEnd = shiftEnd;
        this.breakTaken = breakTaken;
        this.breakStart = breakStart;
        this.breakEnd = breakEnd;
        this.isTransportJob = isTransportJob;
        this.transportCompanyName = transportCompanyName;
        this.vehicleRegistration = vehicleRegistration;
    }

Теперь я хочу добавить журнал смен (создать экземпляр объекта журнала смен для пользователя). Проблема в том, что журнал смен может иметь несколько комбинаций. Например, workedForAgent ложно, не нужно передавать agentName. Как я могу сделать это, не создавая несколько конструкторов, потому что может быть несколько возможных комбинаций? Например, пользователь может работать на агента, но не брать перерыв, что означает, что время начала и окончания перерыва не должно передаваться. Но для этого потребуется так много конструкторов для всех возможных комбинаций. Любая альтернатива?

Также я использую базу данных комнат, чтобы добавить всю эту информацию. Например, если workedForAgent ложно, автоматически установите agentName на ноль. Как это тоже можно было сделать.

Привет! На мой взгляд, лучше всего было бы иметь разные конструкторы, позволяющие сразу понять, что вы собираетесь делать с каждым из них. Альтернативой может быть фабрика объектов со статическими методами, объясняющими, что они делают с объектами. Наличие одного конструктора заставит вас напоминать о различных комбинациях аргументов.

Luke 21.03.2019 16:42

Вы можете уменьшить аргументы до минимума, который используется для каждого Shift. Затем установите остальные переменные через сеттеры

shalama 21.03.2019 16:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
393
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Взгляните на Шаблоны строителя.

Builder pattern is a creational design pattern it means its solves problem related to object creation.

It typically solve problem in object oriented programming i.e determining what constructor to use.

Краткий ответ: Использовать геттеры/сеттеры

Длинный ответ: Альтернативный метод здесь заключается в том, что вы можете создавать экземпляры переменных, которые, как вы уверены, должны существовать в конструкторе, а затем другие условные переменные могут быть определены с помощью методов установки, и вы можете легко получить их с помощью методов получения.

public class ShiftLog {

    private Object userUid;
    private String companyName;
    private boolean workedForAgent;
    private String agentName;
    private Date shiftStart;
    private Date shiftEnd;
    private boolean breakTaken;
    private Date breakStart;
    private Date breakEnd;
    private boolean isTransportJob;
    private String transportCompanyName;
    private String vehicleRegistration;

    public ShiftLog(String companyName, Date shiftStart, Date shiftEnd) {

        this.userUid = FirebaseAuth.getInstance().getCurrentUser().getUid();
        this.companyName = companyName;
        this.shiftStart = shiftStart;
        this.shiftEnd = shiftEnd;

    }

    public boolean isWorkedForAgent() {
        return workedForAgent;
    }

    public void setWorkedForAgent(boolean workedForAgent) {
        this.workedForAgent = workedForAgent;
    }

    public String getAgentName() {
        return agentName;
    }

    public void setAgentName(String agentName) {
        this.agentName = agentName;
    }

    public boolean isBreakTaken() {
        return breakTaken;
    }

    public void setBreakTaken(boolean breakTaken) {
        this.breakTaken = breakTaken;
    }

    public Date getBreakStart() {
        return breakStart;
    }

    public void setBreakStart(Date breakStart) {
        this.breakStart = breakStart;
    }

    public Date getBreakEnd() {
        return breakEnd;
    }

    public void setBreakEnd(Date breakEnd) {
        this.breakEnd = breakEnd;
    }

    public boolean isTransportJob() {
        return isTransportJob;
    }

    public void setTransportJob(boolean isTransportJob) {
        this.isTransportJob = isTransportJob;
    }

    public String getTransportCompanyName() {
        return transportCompanyName;
    }

    public void setTransportCompanyName(String transportCompanyName) {
        this.transportCompanyName = transportCompanyName;
    }

    public String getVehicleRegistration() {
        return vehicleRegistration;
    }

    public void setVehicleRegistration(String vehicleRegistration) {
        this.vehicleRegistration = vehicleRegistration;
    }
}

Добавление в @Kodiak Вы можете заменить свой конструктор на конструктор в несколько кликов как упоминалось здесь https://www.jetbrains.com/help/idea/replace-constructor-with-builder.html

Кроме того, самое приятное то, что он автоматически рефакторит все вхождения конструктора с билдером.

Другие вопросы по теме