La respuesta corta a "¿por qué no está en Cloneable
desuso?" (o de hecho, por qué no está en X
desuso, para cualquierX
) es que no se ha prestado mucha atención a despreciarlos.
La mayoría de las cosas que han quedado en desuso recientemente quedaron en desuso porque existe un plan específico para eliminarlas. Por ejemplo, las addPropertyChangeListener
y removePropertyChangeListener
los métodos de LogManager estaban en desuso en Java SE 8 con la intención de dejarlas en Java SE 9. (La razón es que innecesariamente complicadas interdependencias de los módulos.) De hecho, estas API ya se han eliminado desde la primera JDK 9 desarrollo Construye. (Tenga en cuenta que también se eliminaron llamadas de escucha de cambio de propiedad similares Pack200
; consulte JDK-8029806 ).
No existe un plan similar para Cloneable
y para Object.clone()
.
Una respuesta más larga implicaría discutir más preguntas, como qué podría esperarse que suceda con estas API, qué costos o beneficios acumularían la plataforma si se desaprobaran, y qué se comunica a los desarrolladores cuando una API se desaprueba. Exploré este tema en mi reciente charla de JavaOne, Deuda y desaprobación . (Diapositivas disponibles en ese enlace; video aquí .) Resulta que el JDK en sí mismo no ha sido muy consistente en su uso de la degradación. Se ha utilizado para significar varias cosas diferentes, que incluyen, por ejemplo,
Esto es peligroso y debe ser consciente de los riesgos de su utilización (ejemplo: Thread.stop()
, Thread.resume()
, y Thread.suspend()
).
Esto se eliminará en una versión futura
Esto es obsoleto y es una buena idea que use algo diferente (ejemplo: muchos de los métodos en java.util.Date
)
Todos estos son significados distintos, y diferentes subconjuntos de ellos se aplican a diferentes cosas que están en desuso. Y algunos subconjuntos de ellos se aplican a cosas que no están en desuso (pero que tal vez deberían estar en desuso).
Cloneable
y Object.clone()
están "rotos" en el sentido de que tienen fallas de diseño y son difíciles de usar correctamente. Sin embargo, clone()
sigue siendo la mejor manera de copiar matrices, y la clonación tiene una utilidad limitada para hacer copias de instancias de clases que se implementan cuidadosamente. Eliminar la clonación sería un cambio incompatible que rompería muchas cosas. Una operación de clonación podría implementarse de una manera diferente, pero probablemente sería más lenta queObject.clone()
.
Sin embargo, para la mayoría de las cosas, un constructor de copia es preferible a la clonación. Entonces quizás marcandoCloneable
sea apropiado como "obsoleto" o "reemplazado" o algo similar. Esto les diría a los desarrolladores que probablemente quieran buscar en otro lado, pero no indicaría que el mecanismo de clonación podría eliminarse en una versión futura. Desafortunadamente, no existe tal marcador.
Tal como están las cosas, la "desaprobación" parece implicar la eliminación eventual, a pesar del hecho de que una cantidad cada vez menor de características desaprobadas se han eliminado alguna vez, por lo que la desaprobación no parece justificada por el mecanismo de clonación. Quizás en el futuro se pueda aplicar una marca alternativa que dirija a los desarrolladores a utilizar mecanismos alternativos.
ACTUALIZAR
Agregué un historial adicional al informe de error . Frank Yellin, uno de los primeros implementadores de JVM y coautor de la especificación de JVM, hizo algunos comentarios en respuesta al comentario de "perdido en las brumas del tiempo" en la recomendación de TRC citada en la otra respuesta . He citado las porciones relevantes aquí; El mensaje completo está en el informe de error.
Cloneable no tiene métodos por la misma razón que Serializable no. Cloneable indica una propiedad de la clase, en lugar de decir específicamente algo sobre los métodos que admite la clase.
Antes de la reflexión, necesitábamos un método nativo para hacer una copia superficial de un Objeto. De ahí nació Object.clone (). También estaba claro que muchas clases querrían anular este método, y que no todas las clases querrían ser clonadas. Por lo tanto, Cloneable nació para indicar la intención del programador.
Entonces, en resumen. El propósito de Cloneable no era indicar que tenía un método público clone (). Fue para indicar que estaba dispuesto a ser clonado usando Object.clone (), y fue la implementación decidir si hacer público clone () o no.