Java Core middle
Как написать иммутабельный класс?
Ответ
final class (нельзя наследовать). private final поля. Нет сеттеров. Конструктор с defensive copy для mutable-аргументов. Геттеры возвращают defensive copy для mutable-полей (List → Collections.unmodifiableList()), иначе наружу утекает изменяемая ссылка, ведь final защищает только ссылку, а не сам объект.
Разбор: final-поля защищают только ссылку, а не сам объект, поэтому для mutable-полей (List, Date, массивы) обязательны defensive copy в конструкторе и геттерах, иначе наружу утекает изменяемая ссылка. final у класса нужен, чтобы наследник не добавил мутирующее поведение; @Immutable — лишь документирующая аннотация без рантайм-эффекта, а static final делает поле общим для всего класса, а не свойством экземпляра.
Хочешь так же по своей компании — с вопросами по грейдам и задачами? Закажи гайд или забери свежее в Telegram.