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.