Что касается Java, как бы вы себя ведете таким образом? Уже существуют методы для создания неизменяемых объектов, что, возможно, является лучшим способом добиться этого с дополнительными преимуществами. Фактически вы можете эмулировать поведение const, объявляя суперкласс/суперинтерфейс, который реализует только те методы, которые не изменяют состояние, а затем имеют подкласс/подинтерфейс, реализующий методы мутации. Восходящий ваш изменяемый класс к экземпляру класса без методов записи, другие биты кода не могут изменять объект, не отбрасывая его обратно в изменяемую версию (что эквивалентно отбрасыванию const
).
Даже если вы не хотите, чтобы объект был строго непреложным, если вы действительно хотели (что я бы не рекомендовал), вы могли бы установить на него какой-то режим блокировки, чтобы его можно было мутировать только тогда, когда разблокирован. Использовать методы блокировки/разблокировки в качестве приватного или защищать по мере необходимости, и вы получаете некоторый уровень контроля доступа. В качестве альтернативы, если вы не собираетесь использовать этот метод как параметр для его изменения вообще, передать копию этого объекта или скопировать весь объект слишком тяжелый, а затем другой легкий объект данных, содержащий только необходимые Информация. Вы даже можете использовать динамические прокси для создания прокси-сервера для своего объекта, который превращает любые вызовы в методы мутации в no-ops.
В принципе, существует целый ряд способов предотвращения мутации класса, что позволяет выбрать тот, который наиболее подходит для вашей ситуации (подсказка: выберите возможную чистоту, когда это возможно, поскольку это делает объект тривиально небезопасным и проще причина в целом). Нет очевидной семантики для того, как можно было бы реализовать const
, что было бы усовершенствованием этих методов, было бы еще одним делом узнать, что либо будет лишено гибкости, либо будет настолько гибким, чтобы быть бесполезным.
То есть, если я не пропустил что-то, что вполне возможно. :-)
Почему этот вопрос был остановлен, интересно? –
может спровоцировать субъективное/аргументативное обсуждение, хотя формулировка вопроса в изумлении задает вопрос «почему дизайнеры выбрали», а не почему это было хорошим/плохим. – ShuggyCoUk