Saltar al contenido

¿Cómo anular correctamente el método de clonación?

Puede que se de el caso de que encuentres algún fallo con tu código o trabajo, recuerda probar siempre en un ambiente de testing antes subir el código al proyecto final.

Solución:

¿Tienes que usar absolutamente clone? La mayoría de la gente está de acuerdo en que Java clone está roto.

Josh Bloch sobre el diseño: el constructor de copias frente a la clonación

Si ha leído el artículo sobre la clonación en mi libro, especialmente si lee entre líneas, sabrá que pienso clone está profundamente roto. […] Es una lástima que Cloneable se rompe, pero pasa.

Puede leer más discusión sobre el tema en su libro. Efectivo Java 2.ª edición, artículo 11: anulación clone juiciosamente. En su lugar, recomienda utilizar un constructor de copias o una fábrica de copias.

Continuó escribiendo páginas de páginas sobre cómo, si cree que debe hacerlo, debe implementar clone. Pero cerró con esto:

¿Son todas estas complejidades realmente necesarias? Casi nunca. Si extiende una clase que implementa Cloneabletiene pocas opciones más que implementar un buen comportamiento clone método. De lo contrario, es mejor proporcionar medios alternativos de copia de objetos, o simplemente no proporcionar la capacidad.

El énfasis era suyo, no mío.


Ya que dejó en claro que no tiene más remedio que implementar cloneesto es lo que puede hacer en este caso: asegúrese de que MyObject extends java.lang.Object implements java.lang.Cloneable. Si ese es el caso, entonces puede garantizar que lo hará NUNCA atrapar un CloneNotSupportedException. Lanzamiento AssertionError como algunos han sugerido, parece razonable, pero también puede agregar un comentario que explique por qué nunca se ingresará el bloque catch en este caso particular.


Alternativamente, como otros también han sugerido, quizás pueda implementar clone sin llamar super.clone.

A veces es más simple implementar un constructor de copias:

public MyObject (MyObject toClone) 

Le ahorra la molestia de manejar CloneNotSupportedExceptionfunciona con final campos y no tiene que preocuparse por el tipo a devolver.

La forma en que funciona su código es bastante similar a la forma “canónica” de escribirlo. lanzaría un AssertionError dentro de la captura, sin embargo. Señala que esa línea nunca debe ser alcanzada.

catch (CloneNotSupportedException e) 
    throw new AssertionError(e);

Si entiendes que ha resultado de provecho este artículo, sería de mucha ayuda si lo compartieras con otros desarrolladores y nos ayudes a difundir este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *