La clonación de objetos se refiere a la creación de una copia exacta de un objeto. Crea una nueva instancia de la clase del objeto actual e inicializa todos sus campos con exactamente el contenido de los campos correspondientes de este objeto.
Métodos para realizar la clonación de objetos en Java
Existen 3 métodos para crear clonación de objetos en Java que se mencionan a continuación:
- Uso del operador de asignación para crear una copia de la variable de referencia
- Creando una copia usando el método clone()
- Uso del método clone() – Copia profunda
1. Uso del operador de asignación para crear un copia del variable de referencia
En Java, no existe ningún operador para crear una copia de un objeto. A diferencia de C++, en Java, si usamos el operador de asignación, creará una copia de la variable de referencia y no del objeto. Esto se puede explicar tomando un ejemplo. El siguiente programa demuestra lo mismo.
A continuación se muestra la implementación del tema anterior:
Java
// Java program to demonstrate that assignment operator> // only creates a new reference to same object> import> java.io.*;> > // A test class whose objects are cloned> class> Test {> >int> x, y;> >Test()> >{> >x =>10>;> >y =>20>;> >}> }> > // Driver Class> class> Main {> >public> static> void> main(String[] args)> >{> >Test ob1 =>new> Test();> > >System.out.println(ob1.x +>' '> + ob1.y);> > >// Creating a new reference variable ob2> >// pointing to same address as ob1> >Test ob2 = ob1;> > >// Any change made in ob2 will> >// be reflected in ob1> >ob2.x =>100>;> > >System.out.println(ob1.x +>' '> + ob1.y);> >System.out.println(ob2.x +>' '> + ob2.y);> >}> }> |
instancia de en java
>
películas
>Producción
10 20 100 20 100 20>
2. Crear una copia usando el método clone()
La clase cuyo objeto se va a realizar la copia debe tener un método de clonación público en ella o en una de sus clases principales.
- Cada clase que implemente clone() debe llamar a super.clone() para obtener la referencia del objeto clonado.
- La clase también debe implementar la interfaz java.lang.Cloneable cuyo clon de objeto queremos crear; de lo contrario, arrojará CloneNotSupportedException cuando se llame al método de clonación en el objeto de esa clase.
Sintaxis:
protected Object clone() throws CloneNotSupportedException>
i) Uso del método clone() -Copia superficial
Nota – En el siguiente ejemplo de código, el método clone() crea un objeto completamente nuevo con un valor de código hash diferente, lo que significa que está en una ubicación de memoria separada. Pero debido a que el objeto de prueba c está dentro de Test2, los tipos primitivos han logrado una copia profunda, pero este objeto de prueba c todavía se comparte entre t1 y t2. Para superar eso, hacemos explícitamente una copia profunda de la variable de objeto c, que se analiza más adelante.
Java
// A Java program to demonstrate> // shallow copy using clone()> import> java.util.ArrayList;> > // An object reference of this class is> // contained by Test2> class> Test {> >int> x, y;> }> > // Contains a reference of Test and> // implements clone with shallow copy.> class> Test2>implements> Cloneable {> >int> a;> >int> b;> >Test c =>new> Test();> >public> Object clone()>throws> CloneNotSupportedException> >{> >return> super>.clone();> >}> }> > // Driver class> public> class> Main {> >public> static> void> main(String args[])> >throws> CloneNotSupportedException> >{> >Test2 t1 =>new> Test2();> >t1.a =>10>;> >t1.b =>20>;> >t1.c.x =>30>;> >t1.c.y =>40>;> > >Test2 t2 = (Test2)t1.clone();> > >// Creating a copy of object t1> >// and passing it to t2> >t2.a =>100>;> > >// Change in primitive type of t2 will> >// not be reflected in t1 field> >t2.c.x =>300>;> > >// Change in object type field will be> >// reflected in both t2 and t1(shallow copy)> >System.out.println(t1.a +>' '> + t1.b +>' '> + t1.c.x> >+>' '> + t1.c.y);> >System.out.println(t2.a +>' '> + t2.b +>' '> + t2.c.x> >+>' '> + t2.c.y);> >}> }> |
>
>Producción
10 20 300 40 100 20 300 40>
En el ejemplo anterior, t1.clone devuelve la copia superficial del objeto t1. Para obtener una copia profunda del objeto se deben realizar ciertas modificaciones en el método de clonación después de obtener la copia.
ii) Uso del método clone() – Copia profunda
- Si queremos crear una copia profunda del objeto X y colocarla en un nuevo objeto Y, entonces se crea una nueva copia de los campos de los objetos referenciados y estas referencias se colocan en el objeto Y. Esto significa que cualquier cambio realizado en los campos de los objetos referenciados en el objeto X o Y se reflejarán sólo en ese objeto y no en el otro. En el siguiente ejemplo, creamos una copia profunda del objeto.
- Una copia profunda copia todos los campos y realiza copias de la memoria asignada dinámicamente a la que apuntan los campos. Una copia profunda ocurre cuando un objeto se copia junto con los objetos a los que hace referencia.
Java
lista de matrices en orden java
al método de cadena java
// A Java program to demonstrate> // deep copy using clone()> > // An object reference of this> // class is contained by Test2> class> Test {> >int> x, y;> }> > // Contains a reference of Test and> // implements clone with deep copy.> class> Test2>implements> Cloneable {> >int> a, b;> > >Test c =>new> Test();> > >public> Object clone()>throws> CloneNotSupportedException> >{> >// Assign the shallow copy to> >// new reference variable t> >Test2 t = (Test2)>super>.clone();> > >// Creating a deep copy for c> >t.c =>new> Test();> >t.c.x = c.x;> >t.c.y = c.y;> > >// Create a new object for the field c> >// and assign it to shallow copy obtained,> >// to make it a deep copy> >return> t;> >}> }> > public> class> Main {> >public> static> void> main(String args[])> >throws> CloneNotSupportedException> >{> >Test2 t1 =>new> Test2();> >t1.a =>10>;> >t1.b =>20>;> >t1.c.x =>30>;> >t1.c.y =>40>;> > >Test2 t3 = (Test2)t1.clone();> >t3.a =>100>;> > >// Change in primitive type of t2 will> >// not be reflected in t1 field> >t3.c.x =>300>;> > >// Change in object type field of t2 will> >// not be reflected in t1(deep copy)> >System.out.println(t1.a +>' '> + t1.b +>' '> + t1.c.x> >+>' '> + t1.c.y);> >System.out.println(t3.a +>' '> + t3.b +>' '> + t3.c.x> >+>' '> + t3.c.y);> >}> }> |
>
>Producción
10 20 30 40 100 20 300 40>
En el ejemplo anterior, podemos ver que se ha asignado un nuevo objeto para la clase Test para copiar un objeto que será devuelto al método de clonación. Debido a esto t3 obtendrá una copia profunda del objeto t1. Por lo tanto, cualquier cambio realizado en los campos del objeto 'c' por t3 no se reflejará en t1.
Copia profunda versus copia superficial
Existen ciertas diferencias entre usar clone() como una copia profunda y como una copia superficial, como se menciona a continuación:
- Copia superficial es el método de copiar un objeto y se sigue de forma predeterminada en la clonación. En este método, los campos de un objeto antiguo X se copian al nuevo objeto Y. Mientras se copia el campo de tipo de objeto, la referencia se copia a Y, es decir, el objeto Y apuntará a la misma ubicación señalada por X. Si el valor del campo es un tipo primitivo, copia el valor del tipo primitivo.
- Por lo tanto, cualquier cambio realizado en los objetos referenciados en el objeto X o Y se reflejará en otros objetos.
Las copias superficiales son baratas y sencillas de hacer. En el ejemplo anterior, creamos una copia superficial de el objeto.
¿Por qué utilizar el método de clonación() o Ventajas del método de clonación
- Si utilizamos el operador de asignación para asignar una referencia de objeto a otra variable de referencia, apuntará a la misma ubicación de dirección del objeto anterior y no se creará ninguna copia nueva del objeto. Debido a esto, cualquier cambio en la variable de referencia se reflejará en el objeto original.
- Si usamos un constructor de copia, entonces tenemos que copiar todos los datos explícitamente, es decir, tenemos que reasignar todos los campos de la clase en el constructor explícitamente. Pero en el método de clonación, este trabajo de crear una nueva copia lo realiza el método mismo. Entonces, para evitar procesamiento adicional, utilizamos la clonación de objetos.