Одна особенность неизменяемых классов, которая еще не была вызвана: хранение ссылки на глубоко неизменяемый объект класса является эффективным средством хранения всего содержащегося в нем состояния.Предположим, у меня есть изменяемый объект, который использует глубоко неизменяемый объект для хранения информации о состоянии на 50 КБ.Предположим, далее, что я хочу 25 раз сделать «копию» моего оригинального (изменяемого) объекта (например, для буфера «отменить»);состояние может меняться между операциями копирования, но обычно это не так.Создание «копии» изменяемого объекта просто потребует копирования ссылки на его неизменное состояние, поэтому 20 копий просто составят 20 ссылок.Напротив, если бы состояние содержалось в изменяемых объектах на 50 тыс., Каждая из 25 операций копирования должна была бы создавать свою собственную копию данных на 50 тыс.;хранение всех 25 копий потребует хранения в основном дублированных данных.Даже если первая операция копирования создаст копию данных, которая никогда не изменится, а другие 24 операции теоретически могут просто сослаться на это, в большинстве реализаций не будет никакого способа для второго объекта, запрашивающего копиюинформация, позволяющая узнать, что неизменная копия уже существует (*).
(*). Иногда можно использовать один паттерн: изменяемые объекты имеют два поля для хранения своего состояния - одно в изменяемой форме и однонеизменная форма.Объекты могут быть скопированы как изменяемые или неизменные, и они могут начать жизнь с того или иного набора ссылок.Как только объект хочет изменить свое состояние, он копирует неизменяемую ссылку на изменяемую (если это еще не было сделано) и делает недействительной неизменную ссылку.Когда объект копируется как неизменяемый, если его неизменяемая ссылка не установлена, будет создана неизменяемая копия, и неизменная ссылка указывает на это.Этот подход потребует несколько больше операций копирования, чем «полноценная копия при записи» (например, запрос копирования объекта, который был мутирован, поскольку последняя копия потребует операции копирования, даже если исходный объект никогда не мутирует снова), но это позволяет избежать сложностей с потоками, которые может повлечь за собой FFCOW.