make implement java cloneable

implement - Confusión sobre la interfaz clonable y object.clone() en java



make object copy java (4)

Si tengo:

class foo implements Cloneable

y luego hacer:

bar = new foo(); bar.clone();

Obtengo una copia superficial sin necesidad de escribir ningún código bar.clone() como normalmente tendría que hacer cuando implemento una interfaz.

Entiendo que las funciones de una interfaz deben ser completadas por la clase que la implementa, y Object.clone() no tiene implementación (según los documentos, "La clase Object no implementa la interfaz Cloneable")

Entonces, ¿de dónde viene mi clon superficial? ¿Dónde está el código que implementa bar.clone() si Object.clone() no tiene implementación? Estoy confundido.


Entiendo que las funciones de una interfaz deben ser completadas por la clase que la implementa, y Object.clone () no tiene implementación (según los documentos, "La clase Object no implementa la interfaz Cloneable")

hay una diferencia entre decir que Object.clone () no tiene implementación y la clase Object no implementa la interfaz Cloneable

El método de clonación del objeto tiene implementación, hace una copia en memoria del objeto que llamó método de clonación.

tienes razón, la clase de objetos no se puede clonar, todo lo que hace es verificar si el objeto se puede clonar o no.

el punto de respuesta anterior es que lea un libro, creo que puedo dar una solución rápida para responder a su pregunta

Entonces, ¿de dónde viene mi clon superficial? Método de clonación del objeto.

¿Dónde está el código que implementa bar.clone () si Object.clone () no tiene implementación? Tiene implementación, escrita en código nativo.


Si tengo: "la clase foo implementa clonable"

y luego haz: bar = new foo (); bar.clone ();

Obtengo una copia superficial sin necesidad de escribir ningún código bar.clone () como normalmente tendría que hacer cuando implemento una interfaz.

Eso solo funcionaría si lo llama dentro de la clase "foo", porque el método .clone () heredado de Object está protegido.

Entiendo que las funciones de una interfaz deben ser completadas por la clase que la implementa, y Object.clone () no tiene implementación (según los documentos, "La clase Object no implementa la interfaz Cloneable")

(1) Object.clone() tiene una implementación. Hace una copia superficial del objeto si el objeto implementa Cloneable . (2) El método .clone() no forma parte de ninguna interfaz. (3) Tener un método .clone() e implementar la interfaz Cloneable son cosas completamente separadas. Solo necesita implementar la interfaz Cloneable si desea utilizar el método de clone de Object ; sin embargo, esta es la forma recomendada de escribir un método de clone para su clase: para obtener su copia del método de clone de la superclase, que eventualmente sube al método de clone Object .


Object.clone () tiene una implementación:

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

Este enlace explica la interfaz Cloneable: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Cloneable.html

Un objeto debe implementar la interfaz Cloneable para llamar al método clone (), de lo contrario, lanza una excepción CloneNotSupportedException.

Por definición, todas las clases en Java amplían la clase de Objeto base, y la clase de Objeto tiene un método clone () predeterminado, incluso aunque el propio Objeto no implemente Clonable. Se llamará al método clone () de la clase Object si no lo reemplaza usted mismo.


Ten mucho cuidado al usar el clon. De hecho, lo evitaría por completo. Nunca lo he necesitado. PERO ... dicho esto, la mejor discusión sobre el tema que he leído es por Joshua Bloch, en Effective Java. Lea el punto 11: "Anular el clon de forma juiciosa".

POR FAVOR, hágase un favor y lea ese artículo. De hecho, recomiendo leer todo el capítulo (y el resto del libro). Todo lo que necesitas saber sobre el clon y por qué te lo advierto está ahí.

Espero que esto ayude.