java - variable - lombok cloneable




Почему Cloneable не устарел? (2)

Обычно понятно, что интерфейс Cloneable в Java нарушен. Для этого есть много причин, о которых я не буду говорить; others уже это сделали. Это также позиция самих архитекторов Java .

Поэтому мой вопрос: почему еще не устарели? Если основная команда Java решила, что она сломана, тогда они также должны были подумать об устаревании. Каковы их причины против этого (в Java 8 он все еще не устарел )?


почему он еще не устарел?

Поскольку JCP не счел нужным сделать это и никогда не сможет этого сделать. Спроси их. Вы спрашиваете не в том месте.

Каковы причины сохранения этой вещи в Java API

Никто не удалит что-либо из Java API из-за требования обратной совместимости. В последний раз это произошло с изменением модели событий AWT между 1.0 и 1.1 в 1996/7 году.


В 1997 году была зарегистрирована bug в bug о добавлении метода clone() в Cloneable , поэтому она больше не будет бесполезной. Он был закрыт с резолюцией «не исправить», и обоснование было следующим:

Технический комитет по обзору Sun (TRC) подробно рассмотрел этот вопрос и рекомендовал не предпринимать никаких действий, кроме улучшения документации текущего интерфейса Cloneable . Вот полный текст рекомендации:

Существующие API-интерфейсы клонирования объектов Java являются проблематичными. Существует защищенный метод «клонировать» на java.lang.Object и существует интерфейс java.lang.Cloneable. Цель состоит в том, что если класс хочет разрешить другим людям клонировать его, он должен поддерживать интерфейс Cloneable и переопределять метод защищенного клона по умолчанию с помощью метода public clone. К сожалению, по причинам, которые легко теряются в тумане времени, интерфейс Cloneable не определяет метод клонирования.

Эта комбинация приводит к большому количеству путаницы. Некоторые классы утверждают, что поддерживают Cloneable, но случайно забывают о поддержке метода clone. Разработчики сбиты с толку о том, как должен работать Cloneable и какой клон должен делать.

К сожалению, добавление метода клонирования к Cloneable было бы несовместимым изменением. Он не нарушит совместимость с двоичными файлами, но он нарушит совместимость источника. Неопровержимые данные свидетельствуют о том, что на практике существует ряд случаев, когда классы поддерживают интерфейс Cloneable, но не обеспечивают общедоступный метод клонирования. После обсуждения TRC единогласно рекомендовал, чтобы мы не модифицировали существующий интерфейс Cloneable из-за влияния совместимости.

Альтернативным предложением было добавить новый интерфейс java.lang.PubliclyCloneable, чтобы отразить первоначальную цель Cloneable. От 5 до 2 большинства, TRC рекомендовал против этого. Основная проблема заключалась в том, что это добавило бы еще больше путаницы (включая путаницу правописания!) К уже запутанной картине.

TRC единогласно рекомендовал добавить дополнительную документацию к существующему интерфейсу Cloneable, чтобы лучше описать, как он предназначен для использования, и описать «лучшие практики» для разработчиков.

Таким образом, хотя это не относится непосредственно к устаревшим причинам, причина не в том, что Cloneable «устарела» заключается в том, что технический обзор Comitee решил, что изменение существующей документации будет достаточно, чтобы сделать этот интерфейс полезным. И так они и сделали. До Java 1.4, Cloneable был зарегистрирован следующим образом:

Класс реализует интерфейс Cloneable для указания методу Object.clone (), который является законным для этого метода для создания экземпляров экземпляра этого класса для поля.

Попытки клонировать экземпляры, которые не реализуют интерфейс Cloneable, приводят к исключению исключения CloneNotSupportedException.

Интерфейс Cloneable не объявляет никаких методов.

Начиная с версии Java 1.4 (которая была выпущена в феврале 2002 года) до текущей версии (Java 8) она выглядит так:

Класс реализует интерфейс Cloneable для указания методу Object.clone (), который является законным для этого метода для создания экземпляров экземпляра этого класса для поля. Вызов метода клонирования объекта в экземпляре, который не реализует интерфейс Cloneable, приводит к исключению исключения CloneNotSupportedException.

По соглашению классы, реализующие этот интерфейс, должны переопределять Object.clone (который защищен) общедоступным методом. Дополнительную информацию об переопределении этого метода см. В Object.clone ().

Обратите внимание, что этот интерфейс не содержит метода клонирования. Следовательно, невозможно клонировать объект только в силу того, что он реализует этот интерфейс. Даже если метод clone активируется рефлексивно, нет никакой гарантии, что он будет успешным.





cloneable