Как я понимаю, вы хотите, чтобы ничто снаружи SomeClass
не могло мутировать объект value
.
В C++ вы можете вернуть ссылку на const (вообще не копировать), но Java этого не имеет. Итак, давайте посмотрим на копирование ...
Во-первых, знайте, что некоторые объекты не могут скопировать. Например, поток, элементы gui и т. Д. Таким образом, попытка скопировать все объекты с самого начала - это безнадежная работа.
Но как насчет объектов, которые являются copiable?
В Java вы не можете вызвать конструктор копирования (или любой другой конструктор) общего типа (Calling constructor of a generic type).
Интерфейс Cloneable
, но это действительно не более, чем обещание, что clone
работает; фактически не выставлен clone
Публично. Таким образом, для дженериков вы должны использовать отражение, как показано на рисунке here.
К сожалению, нет правильного решения. Единственный жизнеспособный (за исключением изменения цели или семантики вашего класса) заключается в использовании метода clone
, как показано в приведенной выше ссылке, и понимать, что некоторые объекты не могут быть скопированы.
В конечном счете, лучше всего найти решение, которое не требует этого. Создайте (не общий) класс оболочки только для чтения, который предоставляет методы, не связанные с мутацией. Или укажите в документации, что методы мутирования не должны вызываться.
Я думаю, что вы проиграли здесь из-за того, как структурирована Java. Интерфейс Cloneable является причудливой старой шуткой, поэтому вы не можете положиться на это, и в Java нет ничего, что позволило бы объявить общий объект только для чтения. С положительной стороны клиентский код выбирает, какие классы содержатся в SomeClass, поэтому клиентский код может выбрать создание неизменяемых версий объектов, прежде чем хранить их в SomeClass. Совершенно очевидно, но я не думаю, что вы можете гарантировать, что вы хотите получить воздухонепроницаемый результат. – Bobulous
Да, к сожалению (хотя действительно ли неудачно для обсуждения), C++ делает это отлично, но Java никогда не собирался это делать. –