306 votes

Comment cloner ArrayList et également cloner son contenu ?

Comment puis-je clone ArrayList mais également cloner ses objets en Java 1.5 ?

Par exemple j’ai :

Et je m’attends que les objets dans clonedList ne sont pas les mêmes que dans liste de chiens.

Merci pour toute réponse !

217voto

Varkhan Points 6756

Vous aurez besoin d’effectuer une itération sur les éléments et de cloner un par un, mettant les clones dans votre tableau de résultat que vous alliez.

Pour que cela fonctionne, bien entendu, vous devrez obtenir votre objet de chien pour implémenter l’interface Cloneable et la méthode clone().

216voto

cdmckay Points 11234

J’ai, personnellement, ajoutez un constructeur au chien :

Alors juste une itération (comme indiqué dans la réponse de Varkhan) :

Selon moi, que l’avantage de ceci est qu'il ne faut pas Glander avec les trucs Cloneable cassé en Java. Il correspond également à la manière que vous copiiez collections Java.

Une autre option pourrait consister à écrire votre propre interface ICloneable et l’utiliser. De cette façon, vous pourriez écrire une méthode générique pour le clonage.

153voto

Rose Perrone Points 14478

Tous les types de collections de copier des constructeurs. Les utiliser.

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

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

De Efficace Java 2nd Edition, Point 11: Remplacer clone judicieusement

Compte tenu de tous les problèmes associés à Clonable, il est sûr de dire autres interfaces ne devrait pas s'étendre, et que les classes conçu pour la succession (Article 17) ne devrait pas la mettre en œuvre. En raison de ses nombreuses lacunes, certains programmeurs experts choisissent simplement de ne jamais remplacer la méthode clone et de ne jamais faire valoir, sauf, peut-être, à copier des tableaux. Si vous créez une classe pour l'héritage, sachez que si vous choisissez de ne pas fournir une sage protégé méthode clone, il sera impossible pour les sous-classes pour mettre en œuvre Clonable.

Ce livre décrit également les nombreux avantages de copier les constructeurs ont plus de Clonable/cloner.

  • Ils ne comptent pas sur un risque extra-linguistique de création de l'objet mécanisme
  • Ils n'exigent pas de inapplicable adhésion à finement documenté conventions
  • Ils n'entrent pas en conflit avec la bonne utilisation de finale champs
  • Qu'ils ne jettent pas inutile checked exceptions
  • Ils ne nécessitent pas de jette.

Prenons un autre avantage de l'utilisation de la copie constructeurs: Supposons que vous avez un HashSet s, et que vous voulez copier en tant que TreeSet. La méthode clone ne peut pas offrir cette fonctionnalité, mais il est facile, avec une conversion constructeur: new TreeSet(s).

17voto

Cojones Points 1006

Je pense que le courant vert réponse est mauvaise , pourquoi me demanderez-vous?

  • Elle peut nécessiter d'ajouter beaucoup de code
  • Il exige de vous à la liste de toutes les Listes à copier et de le faire

La façon la sérialisation est aussi mauvais de l'omi, vous pourriez avoir à ajouter Serializable tous sur la place.

Quelle est donc la solution:

Java Profonde-Clonage de la bibliothèque Le clonage de la bibliothèque est un petit open source (licence apache) bibliothèque java qui profonde clones objets. Les objets n'ont pas à mettre en œuvre les Clonable interface. Effectivelly, cette bibliothèque peut cloner un des objets java. Il peut être utilisé à-d. dans les implémentations de cache si vous ne voulez pas l'objet mis en cache à être modifiés ou chaque fois que vous voulez créer une copie en profondeur des objets.

Cloner cloner=new Cloner();
XX clone = cloner.deepClone(someObjectOfTypeXX);

Consultez-le à l' http://code.google.com/p/cloning/

2voto

Stephan202 Points 27707

Vous devez cloner l’instance ArrayList à la main (par itération sur elle et en copiant chaque élément un new ArrayList), parce que clone() ne le fera pas pour vous. Raison de ceci est que les objets contenus dans ArrayList ne peuvent pas implémenter Clonable eux-mêmes.

Edit:... et c’est exactement de code de ce Varkhan.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X