Что такое immutable объекты
Что проверяют
Знаете ли вы условия неизменяемости и понимаете ли, зачем она нужна помимо «так безопаснее».
Как отвечать
Неизменяемый объект это объект, состояние которого нельзя изменить после создания. Классический пример это String, Integer, LocalDate.
Условия неизменяемости в Java:
- класс
finalили все методыfinal, чтобы наследник не добавил изменяемость; - все поля
private final; - нет сеттеров и любых методов, меняющих состояние;
- изменяемые поля не утекают наружу: в конструкторе делается защитная копия, а геттер отдаёт копию или неизменяемое представление. Иначе неизменяемость мнимая: список внутри поменяют снаружи.
Зачем это нужно:
- потокобезопасность бесплатно: неизменяемый объект можно публиковать между потоками без синхронизации. Гарантии
finalполей в модели памяти обеспечивают корректную видимость; - безопасность как ключа: хеш не меняется, значит объект не теряется в
HashMap; - предсказуемость: значение не изменится под ногами, отладка проще;
- кэширование и переиспользование: пул строк и кэш маленьких
Integerвозможны именно из-за неизменяемости.
Цена: каждое изменение создаёт новый объект. Отсюда StringBuilder для конкатенации в цикле.
Инструменты: record в Java (генерирует неизменяемый класс с equals, hashCode и toString), List.of и Map.of для неизменяемых коллекций, data class с val в Kotlin.
Где спотыкаются
Считают достаточным final у полей, забывая про защитные копии изменяемых объектов.
Уверены, что final у ссылки делает объект неизменяемым.
Не знают, что Collections.unmodifiableList это обёртка: исходный список менять всё ещё можно.
Конкатенируют строки в цикле и не понимают, откуда мусор.