El método Object.clone() no especifica si la copia de una subclase es una copia profunda o superficial, es completamente dependiente de la clase específica. El método Object.clone() mismo hace una copia superficial (copia el estado interno de la clase Object), pero las subclases deben anularlo, llamar a super.clone() y copiar su estado interno según sea necesario (superficial o profundo).
Especifica algunas convenciones, que puede o no seguir. Para (a.getClass() == a.clone(). GetClass()) para devolver true, debe llamarse a super.clone() en lugar de simplemente 'new Subclass()', ya que supuestamente super.clone() lo haría correctamente crea una instancia de la clase de este objeto (incluso en subclases) y copia todo el estado interno, incluidos los campos privados, que no pudieron ser copiados por subclases usando un constructor de copia, reglas de visibilidad debidas. O se vería obligado a exponer un constructor que no debería estar expuesto, para una mejor encapsulación.
Ejemplo:
//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;
}
}
copia profunda se utiliza generalmente cuando los objetos dependientes son mutables (como Calendar), y la copia debe ser completamente independiente de la original.
Cuando los objetos dependientes son inmutables (como Fecha), compartir la misma instancia generalmente no es un problema, y una copia superficial puede ser suficiente.
Al usar Object.clone() debe seguir algunas reglas, pero son lo suficientemente simples para ser comprensibles. Probablemente la parte más difícil es definir correctamente qué tan profundo debe copiar en su gráfico de objetos. Un problema lógico, no un problema de idioma, eso es.
Correcto - el escenario más común es "no usar clonar". –
El enlace estaba roto. –
Obtuve este enlace del sitio artima: http://www.artima.com/intv/bloch13.html –