Interfaz clonable en Java

La interfaz Java.lang.Cloneable es una interfaz de marcador . Fue introducido en JDK 1.0. Hay un método clon() en la clase Object. La interfaz clonable es implementada por una clase para hacer que el método Object.clone() sea válido y, por lo tanto, hacer una copia de campo por campo. Esta interfaz permite que la clase de implementación tenga sus objetos para ser clonados en lugar de usar un nuevo operador. 

Declaración

public interface Cloneable

Ejemplo 1: el programa a continuación explica que si intenta clonar un objeto que no implementa la interfaz Cloneable, CloneNotSupportedException , que es posible que desee manejar.

Java

// Java program to Demonstrate the
// application of Cloneable interface
  
import java.io.*;
import java.util.*;
  
class Student {
  
    // attributes of Student class
    String name = null;
    int id = 0;
  
    // default constructor
    Student() {}
  
    // parameterized constructor
    Student(String name, int id)
    {
        this.name = name;
        this.id = id;
    }
    
    public static void main(String[] args)
    {
        // create an instance of Student
        Student s1 = new Student("Ashish", 121);
  
        // Try to clone s1 and assign
        // the new object to s2
        Student s2 = s1.clone();
    }
}

Producción:

prog.java:28: error: incompatible types: Object cannot be converted to Student
        Student s2 = s1.clone();
                             ^
1 error

Ejemplo 2: El siguiente código explica el uso adecuado de la interfaz Cloneable para hacer que el método Object.clone() sea legal. Las clases que implementan esta interfaz deben anular el método Object.clone() (que está protegido) para que pueda invocarse.

Java

// Java program to illustrate Cloneable interface
import java.lang.Cloneable;
  
// By implementing Cloneable interface
// we make sure that instances of class A
// can be cloned.
class A implements Cloneable {
    int i;
    String s;
  
    // A class constructor
    public A(int i, String s)
    {
        this.i = i;
        this.s = s;
    }
  
    // Overriding clone() method
    // by simply calling Object class
    // clone() method.
    @Override
    protected Object clone()
        throws CloneNotSupportedException
    {
        return super.clone();
    }
}
  
public class Test {
    public static void main(String[] args)
        throws CloneNotSupportedException
    {
        A a = new A(20, "GeeksForGeeks");
  
        // cloning 'a' and holding
        // new cloned object reference in b
  
        // down-casting as clone() return type is Object
        A b = (A)a.clone();
  
        System.out.println(b.i);
        System.out.println(b.s);
    }
}
Producción

20
GeeksForGeeks

Copia profunda usando el método clon()

La clonación profunda de objetos es como crear una copia exacta del objeto original copiando los campos del objeto original al objeto clonado. Se asigna una memoria separada para los objetos clonados donde se copia el contenido del objeto original. El método clone() puede crear una copia superficial y profunda del objeto original en función de la implementación del mismo. La copia profunda crea una nueva memoria con el mismo contenido que el 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. Hay tipos de copias como Deep, Shallow y Lazy Copy . El siguiente código explica la copia profunda usando el método clone().

Java

// A Java program to demonstrate deep 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 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();
  
        t.c = new Test();
  
        // 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 0

Nota: Esta interfaz no contiene el método de clonación. Por lo tanto, no es posible clonar un objeto simplemente por el hecho de que implementa esta interfaz. Incluso si el método de clonación se invoca reflexivamente, no hay garantía de que tenga éxito.

Referencia: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Cloneable.html

Publicación traducida automáticamente

Artículo escrito por Ganeshchowdharysadanala y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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