2009-04-02 8 views

Respuesta

36

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

Arnold:

Si tuviera que ser Dios en este punto, y muchas personas son probablemente bueno que no soy, yo diría despreciar Cloneable y tienen un Copyable, porque Cloneable tiene problemas. Además del hecho de que está mal escrito, Cloneable no contiene el método 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.

+0

El diseño es tonto. Me pregunto por qué Sun nunca solucionó esto. – tactoth

+0

¿Por qué no se solucionó en Java 8? ¿Las partes rotas/ineficaces de Java no se han eliminado/cambiado antes? –

+3

¿Está "roto" porque algunas personas lo dicen? "Clonable no contiene el método de clonación" Sí, y su documentación nunca dijo que lo haría. "Eso significa que no puedes probar si algo es una instancia de Cloneable, convertirlo en Cloneable e invocar clones". Una vez más, ese no es el propósito de 'Cloneable' en absoluto. 'Cloneable' es solo para hacer que' Object.clone() 'arroje una excepción o no. Nunca ha sido una interfaz para invocar 'clone'. Tal vez sería bueno si Java tuviera una interfaz así, pero la falta de una no hace que otra interfaz ('Cloneable') se rompa. – newacct

10

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

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

Esencialmente, esto es un defecto de diseño en versiones anteriores de Java que no tienen la intención de fijar en la interfaz Cloneable como el hacerlo romper la compatibilidad con algún código existente.

+0

Me pregunto por qué no añadir la interfaz 'Copyable' a Java 1.2 y más allá ... – EpicPandaForce

+0

@EpicPandaForce Probablemente porque no quieren imitar C++ en ciertas situaciones. La clonación debe usarse con cuidado, la mayoría de las veces no logra lo que desea lograr. Lo que falta en Java es tener parámetros 'const', pero copiar cada instancia de objeto (mutable) no es una buena solución. Y sí, hay algunas cosas en las que Java apesta, y esta es una de ellas.Use Kotlin/clases de datos. –

1

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.

6

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.

desde el sitio web dev-x:

A menudo se llega a través de 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:

+1

No creo que sea un concepto extraño. A veces es útil poder ver si algo puede actuar como un tipo alternativo. Como otros han dicho, Cloneable está roto. –

+0

Se supone que actúan como mixins. No es mi mecanismo favorito en un lenguaje fuertemente tipado como java, pero tiene sentido para Serializable, sorta. – wds

+5

@Serializable hubiera tenido más sentido. O al menos hubiera sido así si las anotaciones hubieran aparecido una década antes. –

5

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

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

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

¿Cuál sería la forma de usar esta interfaz (PublicConeable)? – Otto

+0

@Otto: por ejemplo, un CloneHelper con un método publicCloneable estático público (PublicCloneable obj), que busca null, o simplemente copy (Object obj), y comprueba tanto null como instanceof PublicCloneable –

+0

Cuando devuelve un objeto de un local caché, por ejemplo ... Dicho esto, serializar/deserializar es probablemente más seguro. –

Cuestiones relacionadas