2009-08-12 7 views

Antwort

21

Kurze Antwort: flach.

Nicht-so-kurze Antwort: Es sei denn, es außer Kraft gesetzt ist, AnyRef.clone() verwendet die Java Object.clone() als ihre Umsetzung.

Javadoc- auf Object.clone():

Die Methode Clone für Klasse Object führt eine spezifische Duplizierung. Erstens, wenn die Klasse dieses Objekts die Schnittstelle Cloneable nicht implementiert, wird eine CloneNotSupportedException ausgelöst. Beachten Sie, dass alle Arrays die Schnittstelle Cloneable implementieren. Andernfalls erzeugt diese Methode eine neue Instanz der Klasse dieses Objektes und initialisiert alle seine Felder mit genau die Inhalte der entsprechenden Felder dieses Objekts, wie durch Zuordnung; Der Inhalt von die Felder sind nicht selbst geklont. So führt diese Methode eine "flache Kopie " dieses Objekts, keine "tiefe Kopie" -Operation.

Bitte beachten Sie:

  1. AnyRef.clone(), wie sein Pendant in Java, hat eine "geschützte" Zugriffsebene, so dass ihre nicht von überall aufrufbar.
  2. Sie müssen Cloneable implementieren, damit clone() funktioniert.

Lange Antwort: Lesen Effective Java, 2nd Edition, Punkt 11: Überschreiben von Klon umsichtig

Zusammenfassung: Verwenden Sie es nicht. Es gibt bessere Alternativen.

+3

"Es gibt bessere Alternativen." Würde es Ihnen etwas ausmachen, auf einige zu verweisen? –

+6

1. Kopieren Sie Konstruktor, je C++. 2. Fallklasse mit eingebauter "copy" -Methode in Scala 2.8.x. 3. Verwenden Sie unveränderliche Objekte: Sie müssen nicht kopieren, sondern nur teilen. –

+0

Also C++ -ähnliche Kopierkonstruktoren sind eigentlich (irgendwie) in Ordnung in Scala? Ich kam von C++ zu der Sprache und bevor ich meine erste Kopie machte, wollten Konstrukteure sehen, ob mir etwas fehlte. Scheint ... es ist in Ordnung (meine Objekte haben einen veränderlichen Zustand). – akauppi

Verwandte Themen