Вопрос проверяет умение проектировать неизменяемые объекты и защищаться от побочных изменений состояния.
Неизменяемость достигается за счет запрета изменения внутреннего состояния. Для изменяемых полей используется защитное копирование. Объект не должен предоставлять сеттеры. При доступе к полям возвращаются копии, а не оригиналы. Это предотвращает внешнее влияние на состояние объекта.
Некоторые типы, например Date, являются изменяемыми, но их можно безопасно использовать внутри неизменяемых объектов.
Неизменяемый объект:
не имеет сеттеров
все поля final
состояние задается только в конструкторе
Но этого недостаточно для изменяемых полей.
Защитное копирование — это создание копии изменяемого объекта при:
присваивании
возврате наружу
Пример:
class User {
private final Date birthDate;
public User(Date birthDate) {
this.birthDate = new Date(birthDate.getTime());
}
public Date getBirthDate() {
return new Date(birthDate.getTime());
}
}
В этом примере:
внешние изменения Date не влияют на объект
внутреннее состояние защищено
использовать неизменяемые типы (LocalDate)
оборачивать коллекции в unmodifiable
избегать передачи ссылок наружу
Без защитного копирования:
объект формально выглядит неизменяемым
но его состояние можно изменить извне
контракт неизменяемости нарушается
Вывод: неизменяемость достигается не запретом сеттеров, а контролем доступа к изменяемым данным.