С какой версией Java вы работали и какие нововведения для immutable классов заметили
Что проверяют
Держите ли вы в голове, на чём реально писали, и понимаете ли, что делает объект неизменяемым. Вопрос составной: сначала проверяют честность про версию, потом сразу уходят вглубь, в record и в неизменяемые коллекции.
Как отвечать
Назовите версии, на которых работали, и что из их возможностей использовали. Про неизменяемость есть несколько опорных точек:
record: компактный носитель данных, поля неизменяемые, конструктор,equals,hashCodeиtoStringгенерируются. Сначала появился как предварительная возможность, постоянной частью языка стал в Java 16;- фабрики
List.of,Set.of,Map.ofиз Java 9: сразу неизменяемая коллекция, попытка изменить бросаетUnsupportedOperationException; List.copyOfиCollectors.toUnmodifiableList: именно копия, а не представление поверх исходных данных;Stream.toList: возвращает неизменяемый список, в отличие отcollect(Collectors.toList()).
Полезно добавить, зачем это нужно: неизменяемый объект безопасно делить между потоками без синхронизации, его можно использовать ключом в HashMap, его состояние не испортит чужой код.
Где спотыкаются
Считают, что final у полей достаточно. Модификатор запрещает переприсваивание ссылки, но список внутри останется изменяемым, поэтому в конструкторе делают защитную копию, а наружу отдают неизменяемое представление.
Путают Collections.unmodifiableList с копией. Это обёртка поверх исходного списка: поменяли оригинал, поменялось и то, что видно через обёртку.
Думают, что record даёт глубокую неизменяемость. Если компонентом идёт массив или коллекция, содержимое меняется снаружи, и защиту приходится писать руками в компактном конструкторе.