Bonsoir,
Ayant un objet de type Collection et voulant en faire une copie pour faire du pattern defensive, je ne sais pas comment faire...
La méthode clone n'étant pas disponible sur cette classe...
ex : Collection<Numero> num;
Merci de votre aide
Discussion :
Bonsoir,
Ayant un objet de type Collection et voulant en faire une copie pour faire du pattern defensive, je ne sais pas comment faire...
La méthode clone n'étant pas disponible sur cette classe...
ex : Collection<Numero> num;
Merci de votre aide
Plop,
Pour ce qui est de la méthode clone(), certaines collections la supportent (ArrayList, ...).
Si tu utilises des List, tu peux regarder la méthode Collections.copy.
Enfin, tu peux tout simplement créer une nouvelle Collection, et ajouter tous les éléments de la collection courante, en itérant simplement dessus.
Olivier Pitton
Site personnel : http://site.olivier-pitton.eu.cloudbees.net/
Page Developpez : http://olivier-pitton.developpez.com/
Ok, merci
J’essaie l'itération!
Pour ce qui est d'utiliser la méthode clone(), je n'y arrive cependant pas...
Une méthode me renvoyant un objet "Collection".
clone n'est pas disponible et j'ai bien implémenté Cloneable et surchargé clone()...Collection<Maire> newcoll = new ArrayList<Maire>();
L'itération est réussie!
Pensez-tu cependant qu'il y a une possibilité d'utiliser clone() même si l'objet est de type "Collection"?
Merci d'avance![]()
Je ne suis pas sûr que 'clone' soit la bonne voie à suivre.
Pour moi, il faut que les objets de la collection implémentent une méthode ou un constructeur de copie défini dans une interface commune.
Dans ce cas la copie peut être réalisée par exemple comme suit:D'autre avis ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Collection<Copyable> getNewCopy(Collection<Copyable> c) throws Exception{ Iterator<Copyable> i = c.iterator(); Collection c2 = c.getClass().newInstance(); while (i.hasNext()){ Copyable o = i.next(); c2.add(new Copyable(o)); }
Voici ce que j'ai fait :
J'essaye votre code après mangerCollection<Copyable> getNewCopy = ...;
Collection<Copyable> newcoll = new ArrayList<Copyable>();
Iterator<Copyable> iter = getNewCopy.iterator();
while(iter.hasNext())
newcoll.add((Copyable) iter.next());![]()
Salut,
Le plus simple serait d'utiliser Collections.unmodifiableCollection() ou un dérivé...
a++
Rebonsoir!
Je ne pense pas que unmodifiableCollection me conviendrait, j'ai peut-être oubliéde préciser que j'aimerais pouvoir modifier la collection retournée par la méthode sans toucher à celle d'origine.
C'est cependant une méthode qui a l'air très utile
Pour ta méthode jdevbe, j'ai cependant une erreur
au niveau de la première paranthèseSyntax error on token "(", ; expected
et
au niveau du cSyntax error, insert ";" to complete LocalVariableDeclarationStatement
Le problème ici est que l'interface Collection n'hérite pas directement de Cloneable. Donc elle n'est prête à être clonée. En revanche la classe ArrayList est bien Cloneable. Tu peux donc faire cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Collection<Maire> newcoll = new ArrayList<Maire>();
Maintenant, le plus simple selon moi est de faire cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public Collection<Maire> copyFrom(ArrayList<Maire> from) { return from.clone(); }
Enfin, si tu désires faire une copie en profondeur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public Collection<Maire> copyFrom(ArrayList<Maire> from) { return new ArrayList<Maire>(from); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public Collection<Maire> copyFrom(Collection<Maire> from) { List<Maire> list = new ArrayList<Maire>(from.size()); for(Maire maire : from) { list.add(maire.clone()); // Si Maire implémente Cloneable. } return list; }
Olivier Pitton
Site personnel : http://site.olivier-pitton.eu.cloudbees.net/
Page Developpez : http://olivier-pitton.developpez.com/
Voici une version plus complète pour être plus claire:
interface
Objet copyable:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public interface Copyable { Copyable newCopy(Copyable c); }
Classe de test:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 class ObjCopyable implements Copyable { int data; ObjCopyable(int i){ this.data = i; } ObjCopyable(ObjCopyable c){ this.data = c.data; } void setData(int i){ this.data = i; } @Override public Copyable newCopy(Copyable c) { return new ObjCopyable((ObjCopyable)c); } @Override public String toString(){ return Integer.toString(data); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 public class Test{ public static void main(String[] args) throws Exception { Collection<Copyable> list = new ArrayList(); ObjCopyable o = new ObjCopyable(1); list.add(o); display(list); Collection<Copyable> listBackup = getNewCopy(list); o.setData(2); display(list); display(listBackup); } static Collection<Copyable> getNewCopy(Collection<Copyable> c) throws Exception{ Iterator<Copyable> i = c.iterator(); Collection c2 = c.getClass().newInstance(); while (i.hasNext()){ Copyable o = i.next(); c2.add(o.newCopy(o)); } return c2; } static void display(Collection<Copyable> c) throws Exception{ Iterator<Copyable> i = c.iterator(); while (i.hasNext()){ Copyable o = i.next(); System.out.println(o); } } }
Partager