El método de clonación y la interfaz Cloneable - 1

"¡Hola, amigo!"

"Hola Kim."

"Voy a hablarte sobre el método clone()".

"El objetivo de este método es clonar un objeto, o en otras palabras, crear un clon/copia/duplicado del objeto".

"Cuando se llama a este método, la máquina virtual Java crea y devuelve un duplicado del objeto al que se llama.

La implementación de la clase Object del método de clonación es muy primitiva: solo se crea un nuevo objeto y los valores de los campos del objeto original se asignan a sus campos.

Si el objeto copiado contiene referencias a otros objetos, esas referencias se copiarán. No se crearán duplicados de esos objetos".

"Hmm. Eso no es mucho para continuar".

"La cuestión es que la máquina virtual de Java no sabe qué objetos se pueden o no clonar. Por ejemplo, los archivos no se pueden clonar. Lo mismo ocurre con una secuencia System.in".

"Entonces, la cuestión de la clonación completa se planteó a los desarrolladores de una clase. "Todo esto es similar a cómo se maneja el método de igualdad. Incluso hay algo comparable a hashCode: la interfaz Cloneable".

"La interfaz Cloneable es lo que se llama una 'interfaz de marcador': no ​​tiene ningún método y se usa para marcar ciertas clases.

"Si el desarrollador de una clase cree que los objetos de la clase se pueden clonar, lo marca con esta interfaz (es decir, hace que la clase implemente Cloneable)".

"Si al desarrollador no le gusta la implementación estándar del método de clonación, debe escribir uno propio que creará un objeto duplicado de la manera correcta".

"Cuando llama al método clone (), Java verifica si el objeto es compatible con la interfaz Cloneable. Si es así, entonces clona el objeto usando el método clone (); si no, lanza una CloneNotSupportedException".

"En otras palabras, ¿debemos anular el método de clonación o hacer que la clase implemente Cloneable?"

"Sí, pero aún debe anular el método. El método clone () se declara como protegido, por lo que solo pueden llamarlo las clases en su paquete (java.lang.*) o sus subclases".

"Estoy un poco confundido, entonces, ¿qué debo hacer para clonar un objeto?"

"Si desea utilizar el método de clonación "predeterminado" de la clase Object, debe:

" a) Agregue la interfaz Cloneable a su clase"

" b) Anule el método de clonación y llame a la implementación de la superclase dentro de su implementación:"

class Point implements Cloneable
{
 int x;
 int y;

 public Object clone()
 {
  return super.clone();
 }
    }

"O puede escribir una implementación del método de clonación por su cuenta:"

class Point
{
 int x;
 int y;

 public Object clone()
 {
  Point point = new Point();
  point.x = this.x;
  point.y = this.y;
  return point;
 }
}

"Ese es un método interesante. Estoy seguro de que lo usaré. Ocasionalmente..."