Почему метод clone () хранится в Object? - PullRequest
4 голосов
/ 14 сентября 2011

Если класс не Cloneable, ни один объект этого класса не может быть клонирован. Тогда почему clone() хранится в классе Object, а не в интерфейсе Cloneable?

Ответы [ 2 ]

2 голосов
/ 14 сентября 2011

Это была ошибка проектирования в Java (да, Java не идеальна!).

Лучше избегать клонирования в Java. Например, Джош Блох указывает в «Эффективной Java», пункт 11:

Интерфейс Cloneable был задуман как смешанный интерфейс (элемент 18) для объектов, чтобы рекламировать, что они разрешают клонирование. К сожалению это не в состоянии служить этой цели. Его основной недостаток в том, что ему не хватает клона метод, и метод клона объекта защищен. Вы не можете без прибегая к рефлексии (пункт 53), вызовите метод клонирования на объект только потому, что он реализует Cloneable. Даже рефлексивный вызов может завершиться неудачей, так как нет гарантии, что объект имеет доступный метод клонирования. Несмотря на этот недостаток и другие, средство является в широком использовании, так что стоит понять это.

Если вы хотите, чтобы ваши объекты были клонируемыми, используйте конструктор копирования или метод копирования.

0 голосов
/ 14 сентября 2011
  1. Cloneable - это маркерный интерфейс, действующий как атрибут для пользователя / разработчика, чтобы определить, является ли класс clonebale.

  2. clone () хранится в классе Object, потому что в вашей реализации clone () рекомендуется вызывать super clone (), это может произойти, только если у суперкласса есть функция clone, даже если он не помечен как cloneable (путем реализации Cloneable), следовательно, сохранение функции clone () в Object имеет смысл.

  3. clone () создает совершенно другой экземпляр класса, который подобно конструктору должен вызывать метод super для создания полноценного экземпляра.

...