intermediate
Immutability where useful
Используйте immutable value objects или controlled mutation, когда это защищает invariants, упрощает concurrency или делает state transitions понятнее.
Иммутабельные value objects — `Money`, `Email`, `DateRange` — не меняются после создания; операции возвращают новые экземпляры. Это защищает инварианты, упрощает рассуждения при concurrency и делает равенство по значениям, не по идентичности.
Контролируемая мутация уместна для aggregates с ясным lifecycle (entity с ID), когда изменения только через domain methods.
На интервью: mutable DTO везде vs immutable value type и польза для отладки.
Типовые ошибки: shallow immutability с mutable вложенными массивами; забытый defensive copy в getters; «иммутабельность» при public setters рядом.
Компромисс — аллокации против ясности — профилируйте hot paths перед отказом от immutability.
Чеклист:
- Immutability для значений без identity.
- Deep-freeze или копия вложенных структур.
- Мутация entity только через domain methods.