Метод Object.clone () не указывает, является ли копия подкласса глубокой или неглубокой копией, он полностью зависит от конкретного класса. Сам метод Object.clone () выполняет поверхностное копирование (копирует внутреннее состояние класса Object), но подклассы должны переопределить его, вызвать super.clone () и при необходимости скопировать свое внутреннее состояние (мелкое или глубокое).
В нем указаны некоторые соглашения, которые вы можете или не должны соблюдать. Для того, чтобы (a.getClass () == a.clone (). GetClass ()) возвратить значение true, следует вызывать super.clone () вместо простого 'new Subclass ()', поскольку предположительно, что super.clone () будет корректно создать экземпляр класса этого объекта (даже в подклассах) и скопировать все внутреннее состояние, включая частные поля, которые не могут быть скопированы подклассами с помощью конструктора копирования, из-за правил видимости. Или вам придется выставить конструктор, который не должен быть выставлен, для лучшей инкапсуляции.
Пример:
//simple clone
class A implements Cloneable {
private int value;
public A clone() {
try {
A copy = (A) super.clone();
copy.value = this.value;
return copy;
} catch (CloneNotSupportedException ex) {}
}
}
//clone with deep and shallow copying
class B extends A {
Calendar date;
Date date;
public B clone() {
B copy = (B) super.clone();
copy.date = (Calendar) this.date.clone(); // clones the object
copy.date = this.date; // copies the reference
return copy;
}
}
Глубокое копирование обычно используется, когда зависимые объекты являются изменяемыми (например, Календарь), и копия должна быть полностью независимой от оригинала.
Когда зависимые объекты являются неизменяемыми (например, Date), совместное использование одного и того же экземпляра обычно не является проблемой, и мелкой копии может быть достаточно.
При использовании Object.clone () вы должны следовать некоторым правилам, но они достаточно просты, чтобы их можно было понять. Вероятно, самая сложная часть - это правильное определение того, как глубоко вы должны копировать в свой граф объектов. Это логическая проблема, а не языковая проблема.