Проверяет знание различий между изменяемыми и неизменяемыми объектами на уровне языка.
Мутабельный (изменяемый) тип позволяет менять внутреннее состояние после создания (например, StringBuilder, ArrayList). Иммутабельный (неизменяемый) тип не позволяет — его состояние фиксируется при создании (например, String, Integer).
Определение: состояние объекта невозможно изменить после конструктора.
Примеры: String, Integer, LocalDate.
Преимущества:
Безопасность в многопоточности — нет гонок состояний.
Простота кэширования и использования в качестве ключей коллекций.
Как создать свой:
Все поля private final.
Нет сеттеров, методы возвращают новый объект при «изменении».
Класс объявлен final или конструкторы защищают от наследования.
Определение: содержат методы, меняющие состояние полей после создания.
Примеры: StringBuilder, коллекции List, Map.
Преимущества:
Экономия на создании новых объектов при частых изменениях.
Более естественное API для наращивания данных (append, add).
Риски:
Требуют внешней синхронизации в многопоточном контексте.
Могут привести к неожиданным побочным эффектам при разделении ссылки на объект.
Если объект представляет «значение» и используется как ключ или передаётся без копирования — предпочтительна иммутабельность.
Если объект часто модифицируется и его копирование дорого — используют мутабельные типы.