Конструктор копирования v. Реализация интерфейса Cloneable - PullRequest
5 голосов
/ 28 декабря 2011

С точки зрения "лучших практик", какая методология предпочтительна для создания "глубокой копии" объекта?

Ответы [ 2 ]

14 голосов
/ 28 декабря 2011

Используйте конструктор копирования.Cloneable - это прямая катастрофа API.См. Действующая Java Элемент 10 ( Элемент 11 во 2-м изд. ).

Элемент 11: Переопределить clone

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

4 голосов
/ 28 декабря 2011

Нет ничего плохого в общей идее клонируемого интерфейса.Это проще, чем конструктор копирования для пользователей API.

Проблемы с Java Cloneable и Object.clone также не так уж и плохи;они могут быть преодолены с небольшим усилием.И у вас всегда может быть свой собственный клонируемый интерфейс.

Java 8 может исправить Cloneable, добавив метод clone() с реализацией по умолчанию

interface Cloneable
    public Object clone() default {  return Cloneables.defaultClone(this); }

, не уверенный, что они планируютсделай так.

...