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 unCopyable
, porqueCloneable
tiene problemas. Además del hecho de que está mal escrito,Cloneable
no contiene el método declone
. Eso significa que no puede probar si algo es una instancia deCloneable
, convertirlo aCloneable
e invocarclone
. 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.