¿Por qué no se especificó el método .clone()
en la interfaz java.lang.Cloneable
?Java: Razón de la interfaz clonable
Respuesta
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 unCopyable
, porqueCloneable
tiene problemas. Además del hecho de que está mal escrito,Cloneable
no contiene el métodoclone
. 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.
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.
Me pregunto por qué no añadir la interfaz 'Copyable' a Java 1.2 y más allá ... – EpicPandaForce
@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. –
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.
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:
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. –
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
@Serializable hubiera tenido más sentido. O al menos hubiera sido así si las anotaciones hubieran aparecido una década antes. –
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();
}
¿Cuál sería la forma de usar esta interfaz (PublicConeable)? – Otto
@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 –
Cuando devuelve un objeto de un local caché, por ejemplo ... Dicho esto, serializar/deserializar es probablemente más seguro. –
- 1. ¿Cuál es el uso de la interfaz clonable en java?
- 2. clonación de objetos sin implementar la interfaz clonable
- 3. Serializable, clonable y uso de memoria en Java
- 4. razón por la interfaz no puede tener método miembro estático
- 5. interfaz Java y la herencia
- 6. Reemplazar clon con y sin clonable
- 7. Interfaz API de Java
- 8. Java rendimiento de la interfaz genérica
- 9. Implementación de la interfaz Java en MATLAB
- 10. ¿Cuál es la razón por la que obtengo "No abstracto, no-.cctor-method en una interfaz"?
- 11. interfaz Java y emisión
- 12. Interfaz IEqualityComparer en Java
- 13. Método opcional en la interfaz Java
- 14. ¿Cómo usar la interfaz SortedMap en Java?
- 15. interfaz Java La conversión a Clase
- 16. Java clase abstracta implementa la interfaz
- 17. interfaz Java extiende comparable
- 18. Matriz de interfaz en Java
- 19. Java - Interfaz, creación de instancias de una interfaz?
- 20. Alcance de la utilidad de la interfaz en java
- 21. Java: establecer la interfaz y las diferencias de interfaz de colección
- 22. Java ORM: Herencia múltiple (interfaz)
- 23. El proceso de Java se cuelga sin razón aparente
- 24. ¿Interfaz como tipo en Java?
- 25. Marco de interfaz de usuario de Java?
- 26. ¿Cuál es la razón de ser de SwingWorker?
- 27. Java Obtener colores predeterminados de la interfaz de usuario
- 28. Uso de D para programar la interfaz nativa de Java
- 29. Cómo determinar la interfaz de red de Internet en Java
- 30. Par de implementación de interfaz Java
El diseño es tonto. Me pregunto por qué Sun nunca solucionó esto. – tactoth
¿Por qué no se solucionó en Java 8? ¿Las partes rotas/ineficaces de Java no se han eliminado/cambiado antes? –
¿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