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
Version imprimable
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.
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()...Citation:
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:
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 manger:roll:Citation:
Collection<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é:oops: 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:D
Pour ta méthode jdevbe, j'ai cependant une erreur
au niveau de la première paranthèseCitation:
Syntax error on token "(", ; expected
et
au niveau du cCitation:
Syntax 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:Collection<Maire> newcoll = new ArrayList<Maire>();
Maintenant, le plus simple selon moi est de faire cela :Code:
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:
1
2
3
4 public Collection<Maire> copyFrom(ArrayList<Maire> from) { return new ArrayList<Maire>(from); }
Code:
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; }
Voici une version plus complète pour être plus claire:
interface
Objet copyable:Code:
1
2
3 public interface Copyable { Copyable newCopy(Copyable c); }
Classe de test:Code:
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:
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); } } }
Ca marche!
Merci à tous et bonne soirée;)