У меня есть этот конструктор...
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 на ноль. Как это тоже можно было сделать.
Вы можете уменьшить аргументы до минимума, который используется для каждого Shift. Затем установите остальные переменные через сеттеры




Взгляните на Шаблоны строителя.
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
Кроме того, самое приятное то, что он автоматически рефакторит все вхождения конструктора с билдером.
Привет! На мой взгляд, лучше всего было бы иметь разные конструкторы, позволяющие сразу понять, что вы собираетесь делать с каждым из них. Альтернативой может быть фабрика объектов со статическими методами, объясняющими, что они делают с объектами. Наличие одного конструктора заставит вас напоминать о различных комбинациях аргументов.