Как в immutable-дизайне моделируют «изменение» и снижают его цену?
«Изменение» — новый объект: методы withX возвращают копию с одним изменённым полем. Для частых правок — изменяемый Builder, отдающий неизменяемый результат, или persistent-структуры с разделением общей части.
- Пример JDK: LocalDate.plusDays, String.replace
- В горячем цикле withX плодит мусор
- Record в Java пока без встроенных withers — пишут вручную или Lombok @With
А ещё StringBuilder → String — та же схема
Подробно
Цена неизменяемости — копирование при «изменении»: методы withX возвращают копию с одним изменённым полем. Для редких изменений это дёшево; для частых берут изменяемый Builder, который собирает состояние и отдаёт неизменяемый результат, или persistent-структуры. Главное — не плодить withX в горячем цикле (мусор для GC); там уместен мутабельный буфер с заморозкой на выходе.
Что хотят услышать
- withX и копирование.
- Builder и persistent-структуры для частых изменений.
Частые ошибки
- Обходить final рефлексией ради «изменения».
- Сыпать withX в горячем цикле.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Меняют поля через рефлексию или Unsafe, обходя модификатор final
- ✓Создают новый объект (withX), а для частых правок — Builder
- ✗Никак — изменяемые данные неизменяемыми объектами не моделируют
- ✗Добавляют сеттеры только для тех полей, что меняются часто
Что спросят дальше
- Чем Builder лучше цепочки withX при частых изменениях?
- Что такое persistent-структуры?
Разбор темы
- Проектирование неизменяемых классов
Зачем нужна неизменяемость, рецепт immutable-класса, защитные копии, безопасная публикация и records.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.