Вопрос проверяет понимание принципов иммутабельности в Java и способов работы с изменяемыми полями внутри неизменяемых классов.
Иммутабельный класс — это класс, экземпляры которого не могут быть изменены после создания. Однако, если класс содержит поля, которые сами по себе являются изменяемыми (mutable), например, java.util.Date или List, то простое объявление их как final не гарантирует неизменность. Внешний код может получить ссылку на такой объект и изменить его содержимое, нарушив контракт иммутабельности.
Для обеспечения истинной иммутабельности необходимо создавать копии mutable объектов при каждом доступе к ним. Это делается в двух местах:
import java.util.Date;
public final class ImmutablePerson {
private final String name;
private final Date birthDate;
public ImmutablePerson(String name, Date birthDate) {
this.name = name;
// Защитная копия в конструкторе
this.birthDate = new Date(birthDate.getTime());
}
public String getName() {
return name;
}
public Date getBirthDate() {
// Защитная копия в геттере
return new Date(birthDate.getTime());
}
}Иммутабельные классы широко используются в многопоточных приложениях, так как они потокобезопасны без синхронизации. Также они упрощают отладку и предотвращают побочные эффекты. Защитные копии — это стандартный способ работы с mutable полями, но они могут снижать производительность из-за создания новых объектов. В таких случаях стоит рассмотреть использование неизменяемых аналогов, например, LocalDate вместо Date.
Вывод: Используйте защитные копии для mutable полей в immutable классах, чтобы гарантировать неизменность и потокобезопасность. Это особенно полезно в многопоточных средах и при работе с API, требующими неизменяемых объектов.