logo

Clonación de objetos en Java

constructor en javaEl clonación de objetos es una forma de crear una copia exacta de un objeto. El método clone() de la clase Object se utiliza para clonar un objeto.

El interfaz java.lang.Cloneable debe ser implementado por la clase cuyo clon de objeto queremos crear. Si no implementamos la interfaz Cloneable, el método clone() genera ClonNotSupportedException .

El método clonar() se define en la clase Objeto. La sintaxis del método clone() es la siguiente:

 protected Object clone() throws CloneNotSupportedException 

¿Por qué utilizar el método clone()?

El método clonar() ahorra la tarea de procesamiento adicional para crear la copia exacta de un objeto. Si lo realizamos usando la nueva palabra clave, tomará mucho tiempo de procesamiento, por eso usamos la clonación de objetos.

Ventaja de la clonación de objetos

Aunque Object.clone() tiene algunos problemas de diseño, sigue siendo una forma fácil y popular de copiar objetos. A continuación se muestra una lista de ventajas de utilizar el método clone():

  • No es necesario escribir códigos largos y repetitivos. Simplemente use una clase abstracta con un método clone() de 4 o 5 líneas de largo.
  • Es la forma más sencilla y eficaz de copiar objetos, sobre todo si la aplicamos a un proyecto ya desarrollado o antiguo. Simplemente defina una clase principal, implemente Cloneable en ella, proporcione la definición del método clone() y la tarea estará lista.
  • Clone() es la forma más rápida de copiar una matriz.

Desventaja de la clonación de objetos

A continuación se muestra una lista de algunas desventajas del método clone():

  • Para usar el método Object.clone(), tenemos que cambiar muchas sintaxis de nuestro código, como implementar una interfaz Cloneable, definir el método clone() y manejar CloneNotSupportedException y, finalmente, llamar a Object.clone(), etc.
  • Tenemos que implementar una interfaz clonable mientras no tenga ningún método. Sólo tenemos que usarlo para decirle a la JVM que podemos realizar clone() en nuestro objeto.
  • Object.clone() está protegido, por lo que tenemos que proporcionar nuestro propio clone() y llamar indirectamente a Object.clone() desde él.
  • Object.clone() no invoca ningún constructor por lo que no tenemos ningún control sobre la construcción de objetos.
  • Si desea escribir un método de clonación en una clase secundaria, todas sus superclases deben definir el método clone() en ellas o heredarlo de otra clase principal. De lo contrario, la cadena super.clone() fallará.
  • Object.clone() solo admite copia superficial, pero necesitaremos anularla si necesitamos una clonación profunda.

Ejemplo de método clone() (clonación de objetos)

Veamos el ejemplo sencillo de clonación de objetos.

 class Student18 implements Cloneable{ int rollno; String name; Student18(int rollno,String name){ this.rollno=rollno; this.name=name; } public Object clone()throws CloneNotSupportedException{ return super.clone(); } public static void main(String args[]){ try{ Student18 s1=new Student18(101,'amit'); Student18 s2=(Student18)s1.clone(); System.out.println(s1.rollno+' '+s1.name); System.out.println(s2.rollno+' '+s2.name); }catch(CloneNotSupportedException c){} } } 
Pruébalo ahora
 Output:101 amit 101 amit 
descarga el ejemplo de clonación de objetos

Como puede ver en el ejemplo anterior, ambas variables de referencia tienen el mismo valor. Así, clone() copia los valores de un objeto a otro. Por tanto, no necesitamos escribir código explícito para copiar el valor de un objeto a otro.

Si creamos otro objeto con una nueva palabra clave y le asignamos los valores de otro objeto a este, requerirá mucho procesamiento en este objeto. Entonces, para guardar la tarea de procesamiento adicional, utilizamos el método clone().