Hay dos casos en los que se CloneNotSupportedException
lanzará:
- La clase que se está
Cloneable
clonando no se implementa (asumiendo que la clonación real eventualmente difiere del Object
método de clonación). Si la clase en la que está escribiendo este método lo implementa Cloneable
, esto nunca sucederá (ya que cualquier subclasa lo heredará de manera apropiada).
- La excepción es lanzada explícitamente por una implementación; esta es la forma recomendada de evitar la clonabilidad en una subclase cuando la superclase lo es
Cloneable
.
El último caso no puede ocurrir en su clase (ya que está llamando directamente al método de la superclase en el try
bloque, incluso si se invoca desde una llamada de subclase super.clone()
) y el primero no debería, ya que su clase claramente debería implementar Cloneable
.
Básicamente, debes registrar el error con seguridad, pero en este caso en particular, solo sucederá si arruinas la definición de tu clase. Por lo tanto, trátelo como una versión verificada de NullPointerException
(o similar): nunca se lanzará si su código es funcional.
En otras situaciones, necesitaría estar preparado para esta eventualidad; no hay garantía de que un objeto dado sea clonable, por lo que al detectar la excepción, debe tomar las medidas adecuadas según esta condición (continuar con el objeto existente, tomar una estrategia de clonación alternativa por ejemplo, serializar-deserializar, lanzar un IllegalParameterException
si su método requiere el parámetro por clonable, etc., etc.).
Editar : Aunque en general debo señalar que sí, clone()
realmente es difícil de implementar correctamente y es difícil para las personas que llaman saber si el valor de retorno será el que quieren, doblemente cuando se consideran clones profundos vs superficiales. A menudo es mejor evitar todo el asunto por completo y usar otro mecanismo.
Cloneable
, lanzar un enAssertionError
lugar de un simpleError
es un poco más expresivo.