2009-08-12 7 views

Répondre

21

Réponse courte: peu profonde.

pas si courte réponse: moins qu'il ne soit remplacé, AnyRef.clone() utilise comme sa mise en œuvre Object.clone() de Java.

Javadoc sur Object.clone():

Le clone procédé pour la classe d'objets effectue une opération de clonage spécifique. Tout d'abord, si la classe de cet objet n'implémente pas l'interface Cloneable, alors une exception CloneNotSupportedException est levée. Notez que tous les tableaux sont considérés comme implémenter l'interface Cloneable. Sinon, cette méthode crée une nouvelle instance de la classe de cet objet et initialise tous ses champs avec exactement le contenu des champs correspondants de cet objet, comme par cession; le contenu de les champs ne sont pas eux-mêmes clonés. Ainsi, cette méthode exécute une "copie peu profonde" de cet objet, et non une opération de "copie profonde ".

S'il vous plaît noter:

  1. AnyRef.clone(), comme son homologue en Java, a un "protégé" niveau d'accès, de sorte que son ne appelable de partout.
  2. Vous devrez implémenter Cloneable pour que clone() fonctionne.

Réponse longue: Lire Effective Java, 2e édition, point 11: Remplacer clone judicieusement

Résumé: Ne pas utiliser. Il y a de meilleures alternatives.

+3

"Il existe de meilleures alternatives." Pourriez-vous en référencer quelques-unes? –

+6

1. Constructeur de copie, par C++. 2. Classe de cas avec méthode "copie" intégrée dans Scala 2.8.x. 3. Utilisez des objets immuables: pas besoin de copier, juste partager. –

+0

Donc les constructeurs de copie de type C++ sont en fait (en quelque sorte) d'accord avec Scala? Je suis arrivé à la langue de C++ et avant de faire ma première copie les constructeurs voulaient voir si je manquais un point. Cela semble ... c'est bon (mes objets ont un état mutable). – akauppi

Questions connexes