Если у вас действительно есть «все эти получатели и сеттеры», вам нужно проверить свой класс лучше, чем в конструкторе. Если инварианты вашего класса таковы, что все weekOfChange, dayOfChange и changeReason должны быть нулевыми или не все должны быть ненулевыми, ваши установщики быстро приведут ваш класс в недопустимое состояние. Вы имеете в виду, что у вас есть сеттеры, или вы хотите, чтобы ваш класс был неизменным?
Прежде чем беспокоиться о том, стоит ли проверять, возможно, проведите анализ вашего класса. Посмотрите на все его действительные состояния и инварианты для данных состояний. Тогда вы поймете, должен ли ваш класс быть изменчивым или неизменным. Там, где у вас есть взаимозависимые коварианты (например, weekOfChange, dayOfChannge и changeReason, имеет смысл объединить их в свой собственный класс и использовать композицию в классе Schedule. Это поместит «правила» этих полей в одно место и упростит расписание .
То же самое с другими областями сотрудничества (например, стоимость и причина стоимости). Затем расписание составляется из самоутверждаемых классов. Если оба они неизменны и Расписание является неизменным, то у вас есть намного более легкая область.
Итак, чтобы ответить на ваш вопрос: лучше, чтобы класс определял свои состояния и инварианты и предоставлял, по возможности, только минимальный уровень своим сотрудникам. Ответственность за внутреннее состояние Графика должна лежать на Графике, и с немного более продуманным дизайном это можно сделать с относительной легкостью.
Итак, у вас есть
class Schedule {
private Change change;
private Cost cost;
private Location location;
public Schedule(Location location, Cost cost, Change change) {
this.change = change;
this.cost = cost;
this.location = location;
}
}
И коллобораторы типа
public class Change {
private Date weekOfChange; //shoudln't these two fields be one, a date is a date after all??
private Date dayOfChange; //shoudln't these two fields be one??
private String changeReason;
public Change(Date weekOfChange Date dayOfChange, String changeReason) {
this.weekOfChange = weekOfChange;
...etc.
}
}
Хотя я настоятельно рекомендую вам защитить ваши инварианты классов защитным копированием любых изменяемых значений, передаваемых клиентским кодом.