gui framework ejemplo java clone specifications cloneable

java - framework - jlabel netbeans



Java: Justificación de la interfaz clonable (5)

¿Por qué no se especificó el método .clone() en la interfaz java.lang.Cloneable ?


Básicamente, es una interfaz rota. Ken Arnold y Bill Venners lo discutieron en Java Design Issues .

Arnold:

Si yo fuera Dios en este punto, y muchas personas probablemente se alegran de que no lo esté, yo diría que desaprobar a Cloneable y tener un Copyable , porque Cloneable tiene problemas. Además del hecho de que está mal escrito, Cloneable no contiene el método de clone . Eso significa que no puede probar si algo es una instancia de Cloneable , convertirlo a Cloneable e invocar clone . Tienes que usar el reflejo otra vez, lo cual es horrible. Ese es solo un problema, pero uno ciertamente lo resolvería.


En Java, existe este concepto de interfaces de marcador. La interfaz Cloneable no tiene métodos o campos y sirve solo para identificar la semántica de ser clonable.

del sitio web dev-x :

A menudo te encontrarás con interfaces en Java que no tienen ningún comportamiento. En otras palabras, son solo definiciones de interfaz vacías. Estos se conocen como interfaces de marcadores. Algunos ejemplos de interfaces de marcadores en la API de Java incluyen:


En el proyecto en el que trabajo, hemos creado una interfaz llamada PublicCloneable, contiene el método de clonación y especifica que es público.

Encuentro esto útil: el hecho de que haya un método de clonación, pero no se puede acceder a él no ayuda mucho.

public interface PublicCloneable extends Cloneable { public Object clone(); }


Porque el método de clonación se implementa en la clase Object debido a su condición "especial": la copia de memoria de objetos de cualquier tipo.


Vea este error en la base de datos de errores de Java:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4098033

Básicamente, esta es una falla de diseño en versiones anteriores de Java que no tienen la intención de corregir en la interfaz Cloneable, ya que al hacerlo se rompería la compatibilidad con algún código existente.