Альтернатива множественным конструкторам - PullRequest
0 голосов
/ 21 марта 2019

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

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 имеет значение false, автоматически установите agentName на ноль.Как это тоже можно сделать.

Ответы [ 3 ]

2 голосов
/ 21 марта 2019

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

Шаблон Builder - это шаблон проектирования, который означает, что он решает проблему, связанную с созданием объекта.

Обычно это решает проблему в объектно-ориентированном программировании, т.е. определяет, какой конструктор использовать.

1 голос
/ 21 марта 2019

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

Плюс, лучшая часть, это будет рефакторинг всех вхождений конструктора с компоновщиком автоматически

0 голосов
/ 21 марта 2019

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

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

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...