Я собираюсь атаковать это с другой точки зрения. Я нахожу неизменные объекты, которые облегчают мне жизнь при чтении кода.
Если у меня есть изменяемый объект, я не уверен, какова его ценность, если он когда-либо используется за пределами моей непосредственной области. Предположим, я создаю MyMutableObject
в локальных переменных метода, заполняю их значениями, а затем передаю их еще пяти методам. Любой из этих методов может изменить состояние моего объекта, поэтому должно произойти одно из двух:
Первое затрудняет рассуждение о моем коде. Во-вторых, мой код вписывается в производительность - я в любом случае имитирую неизменяемый объект с семантикой copy-on-write, но все время делаю это независимо от того, действительно ли вызываемые методы изменяют состояние моего объекта.
Если я вместо этого использую MyImmutableObject
, я могу быть уверен, что то, что я установил, - это то, что значения будут для жизни моего метода. На расстоянии нет «жутких действий», которые меняют его из-под меня, и мне не нужно делать защитные копии моего объекта, прежде чем ссылаться на пять других методов. Если другие методы хотят изменить вещи для своих целей, они должны сделать копию & ndash; но они делают это только в том случае, если им действительно нужно сделать копию (в отличие от моего выполнения перед каждым вызовом внешних методов). Я избавляю себя от умственных способностей отслеживать методы, которые могут быть даже не в моем текущем исходном файле, и я избавляю систему от накладных расходов, бесконечно делая ненужные защитные копии на всякий случай.
(Если я пойду вне мира Java и, скажем, в мире C ++, я могу стать еще более сложным. Я могу сделать объекты похожими, как будто они изменяемы, но за кулисами делают их прозрачно клонированными при любом изменении состояния & mdash , это copy-on-write & mdash, причем никто не мудрее.)