implement example java clone

java - example - ¿Por qué no lanzar.clone anulado?



java deep clone object (3)

Antes de Java 5, los tipos de retorno covariantes no estaban permitidos en absoluto, por lo que Foo clone() ni siquiera compilaría. Debido a que muchas clases Cloneable se han escrito hace mucho tiempo, esa es probablemente la razón de la mayoría de los casos.

Sospecho que las clases más nuevas no lo usan simplemente porque se sabe que clone() es bastante numeroso, y cuando las personas rara vez lo usan, ni siquiera piensan que podrían lanzarlo. Ellos encuentran alguna pregunta "cómo implementar clone ()" y escriben el código de la manera antigua.

Entiendo cómo funciona la clonación de Java y los argumentos en contra de su uso. Digamos que estoy listo para usarlo de todos modos.

Para mayor comodidad, me gustaría escribir un método de clonación para la clase Foo de la siguiente manera:

@Override public Foo clone(){ Foo f = (Foo)super.clone(); //Replace mutable fields return f; }

Por lo que puedo decir, esto sería seguro. Sin embargo, me di cuenta de que las clases clonables en la API no hacen esto. ¿Hay alguna razón para esto y es mal estilo?


Hmm, definitivamente este no es un mal estilo, de hecho, es preferible que lo hagas desde el lanzamiento de java 1.5, porque los tipos de devolución covariantes se introdujeron en la versión 1.5 como parte de los genéricos, y al hacerlo, estás haciendo que tu API sea más fácil uso (no se requeriría casting).

Fuente (Efectiva java 2ª edición).


Object.clone() crea un nuevo objeto donde todos los campos tienen el mismo valor que el original. Para los campos de tipo de referencia, esto significa que el nuevo campo es simplemente una referencia al mismo objeto que el original. No clone campos. Por lo tanto, en muchos casos, la implementación predeterminada conduciría a datos compartidos, lo que puede ser indeseable. Por ejemplo, si ArrayList.clone() usara la implementación predeterminada, terminaría con dos instancias de ArrayList compartiendo la misma matriz de respaldo.

Si todos los campos de un objeto son inmutables, puede ser una buena idea simplemente super.clone() el resultado de super.clone() al tipo apropiado.