Question Clone () vs constructeur de copie qui est recommandé dans Java [dupliquer]


Cette question a déjà une réponse ici:

méthode clone vs constructeur de copie dans java. quelle est la solution correcte. où utiliser chaque cas?


120
2018-03-11 19:08


origine


Réponses:


Le clone est cassé, alors ne l'utilisez pas.

LA MÉTHODE CLONE de la classe Object   est une méthode quelque peu magique   ce qu'aucune méthode Java pure ne pourrait jamais   do: Il produit une copie identique de   son objet. Il a été présent dans le   superclasse d'objet primordiale depuis le   Jours de version bêta de Java   compilateur*; et comme tous les anciens   magie, nécessite le approprié   incantation pour empêcher le sort de   renversement inattendu

Préférer une méthode qui copie l'objet

Foo copyFoo (Foo foo){
  Foo f = new Foo();
  //for all properties in FOo
  f.set(foo.get());
  return f;
}

Lire la suite http://adtmag.com/articles/2000/01/18/effective-javaeffective-cloning.aspx


96
2018-03-11 19:19



Ayez en tête que clone() ne fonctionne pas hors de la boîte. Vous devrez mettre en œuvre Cloneable et remplacer le clone() méthode de fabrication public.

Il existe quelques alternatives, qui sont préférables (puisque la clone() La méthode a beaucoup de problèmes de conception, comme indiqué dans d’autres réponses), et le constructeur de la copie nécessiterait un travail manuel:


48
2018-03-11 19:22



clone () a été conçu avec plusieurs erreurs (voir cette question), il est donc préférable de l'éviter.

De Java 2e édition efficace, Rubrique 11: Ignorer judicieusement le clone

Compte tenu de tous les problèmes associés à Clonable, il est prudent de dire   que d'autres interfaces ne devraient pas l'étendre, et que les classes   conçu pour l'héritage (Point 17) ne devrait pas le mettre en œuvre. En raison de   ses nombreuses lacunes, certains programmeurs experts choisissent simplement de ne jamais   remplacer la méthode de clonage et ne jamais l'invoquer sauf peut-être pour   tableaux de copie. Si vous concevez une classe pour l'héritage, sachez que si   vous choisissez de ne pas fournir une méthode de clone protégée bien comportée, il   il sera impossible pour les sous-classes d'implémenter Cloneable.

Ce livre décrit également les nombreux avantages des constructeurs de copies par rapport à Cloneable / clone.

  • Ils ne s'appuient pas sur un mécanisme de création d'objets extralinguistiques sujet aux risques
  • Ils n'exigent pas une adhésion inapplicable aux conventions peu documentées
  • Ils n'entrent pas en conflit avec l'utilisation correcte des champs finaux
  • Ils ne jettent pas d'exceptions vérifiées inutiles
  • Ils ne nécessitent pas de moulages.

Toutes les collections standard ont des constructeurs de copie. Utilise les.

List<Double> original = // some list
List<Double> copy = new ArrayList<Double>(original);

32
2018-04-10 15:19



N'oubliez pas que le constructeur de copie limite le type de classe à celui du constructeur de copie. Prenons l'exemple:

// Need to clone person, which is type Person
Person clone = new Person(person);

Cela ne fonctionne pas si person pourrait être une sous-classe de Person (ou si Person est une interface). Ceci est le but principal de clone, c'est qu'il peut cloner dynamiquement le type approprié à l'exécution (en supposant que le clone est correctement implémenté).

Person clone = (Person)person.clone();

ou

Person clone = (Person)SomeCloneUtil.clone(person); // See Bozho's answer

À présent person peut être n'importe quel type de Person en admettant que clone est correctement mis en œuvre.


18
2018-02-17 07:13



Voir également: Comment remplacer correctement la méthode de clonage?. Le clonage est cassé en Java, c'est très difficile pour bien faire les choses, et même quand il le fait n'offre pas vraiment beaucoup, donc ça ne vaut pas vraiment la peine.


3
2018-03-11 19:48



Grande tristesse: ni Clonable / clone ni un constructeur ne sont de bonnes solutions: JE NE VEUX PAS CONNAÎTRE LA CLASSE D'EXÉCUTION !!! (Par exemple, j'ai une carte que je veux copier, en utilisant la même implémentation cachée de MumbleMap), je veux juste faire une copie, si cela est pris en charge. Mais, hélas, Cloneable ne dispose pas de la méthode de clonage, donc vous ne pouvez pas taper sur quoi invoquer clone ().

Quelle que soit la meilleure bibliothèque "objet de copie", Oracle devrait en faire un composant standard de la prochaine version de Java (sauf si elle est déjà cachée quelque part).

Bien sûr, si une plus grande partie de la bibliothèque (par exemple, Collections) était immuable, cette tâche de "copie" disparaîtrait. Mais alors nous commencerions à concevoir des programmes Java avec des éléments tels que "invariants de classe" plutôt que le modèle "haricot" de verdammt (créez un objet cassé et modifiez-le jusqu'à ce qu'il soit assez bon).


2
2017-09-25 03:20