Получить доступ

Конструктор сохранил переданный List по ссылке (this.items = items). Почему объект всё равно изменяем?

MiddleООП
Коротко

Поле хранит чужую ссылку: вызывающий меняет список снаружи, и «неизменяемый» объект меняется. final запрещает переприсвоить поле, но не менять содержимое. Нужна защитная копия на входе (List.copyOf) и неизменяемое представление на выходе.

  • Копировать до валидации — иначе гонка «проверил, а потом подменили»
  • Collections.unmodifiableList без копии не защищает от исходной ссылки
  • Дата: java.util.Date изменяема, LocalDate — нет

А ещё List.copyOf запрещает null-элементы

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

final у ссылки запрещает переприсвоить поле, но не делает сам список неизменяемым. Если сохранить переданную ссылку, у вызывающего остаётся та же ссылка, и он поменяет «внутренности» вашего объекта — неизменяемость иллюзорна. Поэтому изменяемые входные данные копируют в конструкторе (List.copyOf(events)), а в геттере возвращают копию или неизменяемое представление. Это defensive copy.

Что хотят услышать

  • Почему final недостаточно.
  • Копии на входе и выходе.

Частые ошибки

  • Думать, что final-ссылка делает содержимое неизменяемым.
  • Возвращать внутренний список из геттера напрямую.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Вызывающий держит ссылку на тот же список и может менять его содержимое снаружи — нужна защитная копия на входе и копия/неизменяемое представление в геттере
  • ✗List нельзя хранить в final-поле, поэтому неизменяемость ломается
  • ✗Проблема возникает, только если список пустой
  • ✗Достаточно пометить поле final — тогда и список станет неизменяемым

Что спросят дальше

  • Что делает List.copyOf на входе?
  • Почему копию нужно делать и в геттере?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем