2011-03-25 17 views
28

No entiendo completamente la idea de devolver super.clone() en el método clone() de una clase. En primer lugar, ¿no estaría relacionado con que devuelva un objeto que es una superclase que contiene menos datos de los solicitados, porque una superclase "no es una" subclase, sino que una subclase "es una" superclase. Y si hubiera una larga cadena de subclases, cada una llamando a super.clone(), ¿por qué eso no llevaría finalmente a llamar a Object.clone() en la raíz de la cadena, que no es ninguna de las subclases?Operación Java: clone() llamando a super.clone()

Lo siento si eso era confuso; Me confundo a veces

+2

http://stackoverflow.com/questions/2156120/java-recommended-solution-for-deep-cloning-copying-an-instance/2156367#2156367 – Bozho

Respuesta

43

La implementación de clone() en Object comprueba si la clase real implementa Cloneable y crea una instancia de esa clase real.

Así que si usted desea hacer su clase cloneable, usted tiene que poner en práctica Cloneable y abatido el resultado de super.clone() a su clase. Otra carga es que la llamada al super.clone() puede arrojar un CloneNotSupportedException que debe atrapar, aunque sepa que no sucederá (ya que su clase implementa Cloneable).

La interfaz Cloneable y el método clone en la clase Object son un caso obvio de diseño orientado a objetos que salió mal.

+1

sigo leyendo que Debería evitar usar clone(), pero al menos quiero entender cómo funciona ... me está volviendo loco – TurtleToes

+1

@TurtleToes: si todas las clases ancestrales implementan clonación usando Super.Clone, las clases derivadas deberían anular clon con una versión que usa super.clone, o simplemente permite que las clases derivadas hereden el método de clonación existente. Si alguna clase ancestral en su lugar la implementa utilizando un constructor de copia, las clases derivadas * all * tendrán que usar también un constructor de copia; usar el método de clonación heredado no sería una opción en ese caso. – supercat

+0

Josh Bloch dice [no hacerlo de esta manera] (http://www.artima.com/intv/bloch13.html) – Blake

3

Lea el javadoc of Object.clone() con más cuidado: devuelve una copia del objeto. La copia es otra instancia de la misma clase que la del objeto en el que se invoca el clon. Es decir. foo.clone().getClass() == foo.getClass().

5

Considere esto: usted tiene una cadena de clases heredadas. cada uno puede (o no) tener sus propias variables. qué clon hace, a diferencia del operador igual (==) que duplica la referencia, es una copia clonada del objeto con una nueva referencia. Para el ejemplo anterior, le gustaría clonar el último objeto de la cadena. Como el último objeto está formado por sus superclases, donde cada una puede tener una implementación de método de clonación diferente, tiene mucho sentido llamar a la implementación de superclase de clon para recibir primero un objeto padre clonado antes de clonar el objeto propio.

Otro término que generalmente se asocia con la clonación es la clonación superficial y profunda. clonación superficial se refiere a la creación de una réplica exacta de un objeto, mientras que la clonación profunda crea una réplica de un objeto y cualquier objeto secundario al que se refiera el objeto original.

Más sobre la clonación en this link

+0

Si tengo una clase que implementa Cloneable, y tiene subclases que tienen una función clone() , esas subclases no necesitan implementar Cloneable también? ¿Eso es porque la interfaz se deriva de la superclase?Además, la subclase no necesita probar la excepción, supongo porque la superclase ya está intentando y no está lanzando una. ¿Es esto correcto? – TurtleToes

+0

si una superclase implementa clonable, todas sus subclases implementan automáticamente clonables y no es necesario especificar explícitamente esta implementación. En cuanto a su segunda Q, no estoy seguro de entender la fraseología: "intente por la excepción". puedes aclarar? –

+0

en la subclase directa del objeto, debe implementar un bloque try para capturar la excepción lanzada por Object.clone(). No te dejará no verificarlo. Sin embargo, una subclase de esta subclase no necesita verificar la excepción cuando se llama a super.clone() como lo hizo la superclase. – TurtleToes