2009-08-12 9 views

Respuesta

21

Respuesta corta: poco profunda.

respuesta no tan corta: A menos que sea anulado, AnyRef.clone() utiliza Object.clone de Java() como su aplicación.

Javadoc en Object.clone():

El clon método para la clase Object realiza una operación de clonación específica. En primer lugar, si la clase de este objeto no implementa la interfaz Cloneable, a continuación, un CloneNotSupportedException es lanzada. Tenga en cuenta que todas las matrices se consideran implementan la interfaz Clonable. De lo contrario, este método crea un nuevo instancia de la clase de este objeto e inicializa todos sus campos con exactamente los contenidos de los correspondientes campos de este objeto, como por asignación; los contenidos de los campos no son clonados. Por lo tanto, este método realiza una "copia superficial" de este objeto, no una operación "copia profunda ".

Tenga en cuenta:

  1. AnyRef.clone(), al igual que su contraparte en Java, tiene un nivel de acceso "protegido", por lo que su no puede llamar desde todas partes.
  2. Deberá implementar Cloneable para que clone() funcione.

Respuesta larga: Leer Effective Java, 2ª edición, artículo 11: clon de anulación juiciosamente

Resumen: No lo utilice. Hay mejores alternativas.

+3

"Hay mejores alternativas". ¿Te importaría hacer referencia a algunos? –

+6

1. Copiar constructor, por C++. 2. Clase de caso con método de "copia" incorporado en Scala 2.8.x. 3. Utilice objetos inmutables: no necesita copiar, solo compartir. –

+0

¿Así que los constructores de copia tipo C++ son realmente (tipo de) bien en Scala? Llegué al lenguaje de C++ y antes de hacer mi primera copia, los constructores querían ver si me faltaba algún punto. Parece ... está bien (mis objetos tienen estado mutable). – akauppi

Cuestiones relacionadas