Bonjour,

Je travaillais sur des Vecteurs contenant des tableaux et j'avais besoin de changer juste quelques valeurs d'un des tableaux, valeurs qui pouvaient s'averer "néfastes".
J'ai donc fait un clone du vecteur de base pour avoir une copie de sauvegarde au cas où il y'aurait des erreurs dans l'autre et je suis tombé sur une constatation étrange :

lorsqu'on clone un objet (un vecteur en tout cas), le clone se contente de faire une copie de "premier degré" des objets qu'il contient puis des références pour les sous-objets.

En effet, voilà ce qui m'est arrivé :

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
Vector v = new Vector() // normal...
v.add(new String[]{"A","B","C"});
 
// Clonage de v
backUpV = (Vector)v.clone();
 
// Changement de "A" en "D" dans le vecteur v
( (String[])v.elementAt(0) )[0] = "D";
 
/* ou bien (c'est equivalent dans les faits) :
 * String[] contenuV = ((String[])v.elementAt(0));
 * contenuV[0] = "D";
 * v.setElementAt(contenuV,0);
 */
 
// Affichage du resultat
System.out.println(
     "premiere lettre de v = "+( (String[])v.get(0) )[0]+"\n"+
     "premiere lettre de backUpV = "+( (String[])backUpV.get(0) )[0]
);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
Le résultat attendu est :
premiere lettre de v = D
premiere lettre de backUpV = A
 
Mais contre toute attente il s'affiche :
premiere lettre de v = D
premiere lettre de backUpV = D
Une alternative qui fonctionne est d'écrire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
String[] contenu = new String[v.size()];
// Transfert du contenu de v dans 'contenu'
for (int i=0; i<contenu.length; i++)
   contenu[i] = ((String[])v.elementAt(0))[i];
 
contenu[0] = "D";
v.setElementAt(contenu,0);
Est-ce un "bug" dans la méhode clone() ou bien est-ce désiré ?

Dans tout les cas c'est étrange (et ennuyeux aussi...)

Loceka.