Беспорядок о cloneable интерфейсе и object.clone () в Java

Быстрее, чем приведенные выше решения, включая решение с самым высоким рейтингом:

(x < 0) ? -1 : (x > 0)
17
задан Joachim Sauer 14 September 2011 в 06:42
поделиться

3 ответа

Будьте очень осторожны при использовании клона. Фактически, я бы полностью этого избегал. Я никогда не нуждался в этом. НО ... как уже было сказано, лучшее обсуждение темы, которое я когда-либо читал, было написано Джошуа Блохом в Эффективной Java. Прочтите пункт 11: «Прекращайте клонирование разумно»

ПОЖАЛУЙСТА, сделайте себе одолжение и прочтите этот пункт. На самом деле я рекомендую прочитать всю эту главу (и остальную часть книги). Все, что вам нужно знать о клоне и почему я предупреждаю вас об этом, находится там.

Надеюсь, это поможет.

29
ответ дан 30 November 2019 в 11:37
поделиться

Object.clone () имеет реализацию:

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html# clone ()

Эта ссылка объясняет интерфейс Cloneable: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Cloneable.html

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

По определению, все классы в Java расширяют базовый класс Object, а класс Object имеет метод clone () по умолчанию, хотя сам Object не реализует Cloneable. Метод clone () класса Object будет вызван, если вы не переопределите его самостоятельно.

7
ответ дан 30 November 2019 в 11:37
поделиться

Если у меня есть: "класс foo реализует cloneable "

, а затем выполните: bar = new foo (); bar.clone ();

Я получаю неглубокую копию без необходимости написать любой код bar.clone (), как я обычно нужно делать, когда я реализовать интерфейс.

Это будет работать, только если вы вызываете его в классе "foo", потому что метод .clone (), унаследованный от Object , защищен.

Я понимаю, что функции интерфейса должны быть заполнены in классом, реализующим его, и Object.clone () не имеет реализации (согласно документации, «Объект класса сам не реализует interface Cloneable ")

(1) Object.clone () действительно имеет реализацию. Он создает мелкую копию объекта, если объект реализует Cloneable . (2) Метод .clone () не является частью какого-либо интерфейса. (3) Наличие метода .clone () и реализация интерфейса Cloneable - это совершенно разные вещи. Вам нужно реализовать интерфейс Cloneable , только если вы собираетесь использовать метод clone объекта Object , однако это рекомендуемый способ написать clone для вашего класса - чтобы получить его копию из метода суперкласса clone , который в конечном итоге переходит в метод Object clone .

1
ответ дан 30 November 2019 в 11:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: