Interfaz clonable en Java – Clonación de objetos

En este post vamos a discutir sobre la clonación de objetos con la ayuda de ejemplos. Como su nombre indica, la clonación de objetos es un proceso de generación de la copia exacta del objeto con el nombre diferente. Veamos cómo se puede hacer esto.

La clase pública DogName implementa Cloneable { private String dname; public DogName(String dname) { this.dname = dname; } public String getName() { return dname; } // Anulando el método clone() de la clase de objeto public Object clone()lanza CloneNotSupportedException{ return (DogName)super.clone(); } vacío estático público main(String[] args) { DogName obj1 = nuevo DogName("Tommy"); try { DogName obj2 = (DogName) obj1.clone(); System.out.println(obj2.getName()); } catch (CloneNotSupportedException e) { e.printStackTrace(); } }}

Salida:

Tommy

Como pueden ver, hemos clonado el objeto obj1 en el objeto obj2. Después de la clonación obtuvimos el mismo nombre de Dog en el objeto obj2, que hemos puesto en el objeto obj1.

Puntos importantes a tener en cuenta en el ejemplo anterior:
1) La clase «DogName» implementa una interfaz clonable.
2) Nuestra clase «DogName» anula el método clone() de la clase Object.
3) Durante la llamada al método clone() manejamos CloneNotSupportedException usando bloques de try catch.

¿Qué pasa si no implementamos la interfaz clonable?

El programa lanzará CloneNotSupportedException si no implementamos la interfaz clonable. Una clase implementa la interfaz Clonable para indicar al método Object.clone() que es legal que ese método haga una copia campo a campo de las instancias de esa clase.

¿El objeto clonado y el objeto original apuntan a la misma ubicación en la memoria

La respuesta es no. El objeto clon tiene su propio espacio en la memoria donde copia el contenido del objeto original. Por eso cuando cambiamos el contenido del objeto original después de la clonación, los cambios no se reflejan en el objeto clonado. Veamos esto con la ayuda de un ejemplo.

La clase pública DogName implementa Cloneable { private String dname; public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } // Anulando el método clone() de la clase de objeto public Object clone()lanza CloneNotSupportedException{ return (DogName)super.clone(); } public static void main(String[] args) { DogName obj1 = new DogName(); try { obj1.setDname("Dog1"); //Clonando obj1 en obj2 DogName obj2 = (DogName) obj1.clone(); //Displaying both the objects content System.out.println(obj1.getDname()); System.out.println(obj2.getDname()); //Seleccionando el nombre en obj2 obj1.setDname("Dog2"); //Displaying both the objects content System.out.println(obj1.getDname()); System.out.println(obj2.getDname()); } catch (CloneNotSupportedException e) { e.printStackTrace(); } }}

Salida:

Perro1Perro1Perro2Perro1

Como pueden ver, cuando cambiamos el contenido del objeto obj1 no se cambia en el objeto clonado obj2.

Referencias:
http://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html
http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone()

Rate this post

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio