implement example java cloneable

example - java cloneable



¿De qué sirve dejar que mi clase implemente Cloneable? (2)

Encontré un código de clase que implementa Clonable , los estados de la documentación:

Una clase implementa la interfaz Cloneable para indicar al método Object.clone () que es legal que ese método haga una copia campo por campo de las instancias de esa clase. Al invocar el método de clonación de Object en una instancia que no implementa la interfaz Cloneable, se genera la excepción CloneNotSupportedException. Por convención, las clases que implementan esta interfaz deberían reemplazar a Object.clone (que está protegido) con un método público. Consulte Object.clone () para obtener detalles sobre cómo reemplazar este método. Tenga en cuenta que esta interfaz no contiene el método de clonación. Por lo tanto, no es posible clonar un objeto simplemente en virtud del hecho de que implementa esta interfaz. Incluso si el método de clonación se invoca de manera reflexiva, no hay garantía de que tenga éxito.

No puedo entender el punto en la implementación de esta clase, como se dijo en los documentos, el método .clone no está implementado en la interfaz, y tengo que implementarlo. Entonces, ¿por qué usar esta clase? ¿Por qué no solo escribo un método copyClass en mi clase para hacer la copia del objeto sin la implementación de esta clase?

Gracias por adelantado.


Para implementar el método de clonación, simplemente haga:

public Object clone() throws CloneNotSupportedException { return super.clone(); }

Por supuesto, puede personalizar el método para hacer una copia más profunda si es necesario.

Llamar a super.clone() es casi obligatorio porque, a menos que la clase sea definitiva y, por lo tanto, no pueda ser anulada, el método clone() debe devolver una instancia de la misma clase que el objeto en el que se llama. Así que simplemente crear una nueva instancia y copiar el estado funcionará para esta clase, pero no para todas las subclases. Además, no siempre tiene acceso a todo el estado contenido en las superclases.

En resumen, usted hace público el método de clonación protegida de Objeto. Y lo primero que hace el método Object.clone() es (este no es el código real, pero esto es lo que hace el método):

if (!(this instanceof Cloneable)) { throw new CloneNotSupportedException(); }

Entonces, Cloneable es solo una interfaz de marcador para que el método Object.clone() sepa que no debe lanzar una excepción cuando se le llama.

Esta es una de las partes más mal diseñadas de Java. Por lo general, debería preferir usar un contructor de copia en lugar de usar clone() .


Te permite escribir código más genérico. Si tiene varias clases que implementan la interfaz Cloneable y desea pasar sus instancias como un argumento al método, no tiene que crear múltiples métodos que difieran con un tipo de variable, solo puede usar Cloneable t . Es lo mismo con otras interfaces. Y, lo mismo con todas las demás interfaces, es algo de herencia múltiple. Implementar esas interfaces también hace que tu código sea más legible.