example java methods clone cloneable

example - java copy constructor



El método clone() del objeto no está visible? (8)

Pregunta:

package GoodQuestions; public class MyClass { MyClass() throws CloneNotSupportedException { try { throw new CloneNotSupportedException(); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { try { MyClass obj = new MyClass(); MyClass obj3 = (MyClass)obj.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } } }

Aquí la clase ''MyClass'' puede clonar su propio objeto llamando al método de clonación en la clase ''Object''. Cuando intento clonar el de esta clase (''MyClass'') en otra clase (''TestSingleTon'') en el mismo paquete ''GoodQuestions'', arroja el siguiente error de tiempo de compilación.

''El método clone () del tipo Object no es visible ''

Entonces, ¿aquí está el código arrojando el error anterior?

package GoodQuestions; public class TestSingleTon { public static void main(String[] args) { MyClass obj = new MyClass(); MyClass obj3 = obj.clone(); ---> here is the compile error. } }


Este error ocurre porque en la clase de Objeto, el método clone () está protegido. Entonces debes anular el método clone () en la clase respectiva. P.ej. Agregue el código siguiente en MyClass

@Override protected Object clone() throws CloneNotSupportedException { return super.clone(); }

También implemente la interfaz Cloneable. P.ej. public class MyClass implements Cloneable


Hice un código de prueba sobre esto y aquí están mis hallazgos:

Cuando un miembro protegido se hereda en un paquete, se convierte en miembro privado de la clase heredada

mientras

cuando un miembro protegido se hereda dentro del mismo paquete, se convierte en miembro predeterminado de la clase heredada.

En su ejemplo, clone () de la clase Object se hereda en MyClass en el paquete. La clase de objeto está en el paquete java.lang y MyClass está en el paquete GoodQuestions. Entonces el método clone () se convierte en un miembro privado de la clase MyClass.

Eso explica por qué no puedes acceder al método clone () desde la clase TestSingleTon.


La sutileza es que el método clone() de MyClass se hereda, no se define en MyClass . Entonces MyClass puede invocar clone() del Object porque está protegido , pero MyClass realmente no tiene un clone() de sí mismo, por lo que TestSingleTon no puede acceder a clone() de MyClass porque no hay un método clone() . Aunque ambos están en un mismo paquete, necesita definir un método clone() en MyClass para asegurar que realmente "tiene" el clone() . Por cierto, no te olvides de implementar la interfaz Cloneable for MyClass .


Para poder clonar MyClass, tiene que implementar la interfaz Cloneable


Porque clone () es un método protegido. Ver Object.clone() para más detalles.

Reemplazar clone () en MyClass y hacer que la clase implemente la interfaz Cloneable .


Solo tienes que hacer que MyClass implemente la interfaz Cloneable. No es necesario provocar la implementación de clone ().


Object.clone() método Object.clone() tiene acceso protegido, lo it''s visible to sub-classes and classes in the same package significa it''s visible to sub-classes and classes in the same package .

Es bueno tener un constructor de copia para copiar manualmente el objeto.

/** Deep copy all the information from other to this */ public MyClass (MyClass other) { this.id = other.id; }

LEER Por qué un constructor de copia de Josh Bloch


clone() tiene acceso protegido. Añadir esto en MyClass

public Object clone(){ try{ return super.clone(); }catch(Exception e){ return null; } }

También cambiar a public class MyClass implements Cloneable