Le problème se produit parce que la classe Test
ne met pas en oeuvre l'interface Cloneable
. Comme indiqué dans le API specs,
si la classe [..] ne met pas en œuvre l'interface Cloneable, puis un CloneNotSupportedException est jeté.
Pour fixer, essayer quelque chose comme:
public class Test implements Cloneable {
...
}
Depuis l'interface Cloneable
déclare aucune méthode (il est appelé une interface marqueur , tout comme Serializable
), il n'y a plus rien à faire. Les instances de votre classe Test
peuvent maintenant être clonées. Toutefois, le mécanisme de clonage par défaut (c'est-à-dire celui de Object
) peut ne pas correspondre exactement à ce que vous recherchez et vous pouvez remplacer la méthode clone()
. La valeur par défaut est de faire une copie superficielle, c'est-à-dire que vous obtiendrez une nouvelle instance distincte de votre classe, mais les champs des deux instances se référeront aux mêmes objets! Par exemple:
class C1 {
Object o;
}
class C2 implements Cloneable {
C1 c1;
}
... main ... {
C2 c2 = new C2();
c2.c1 = new C1();
c2.c1.o = new Object();
C2 c2clone = c2.clone();
System.out.println(c2 == c2clone); // prints false
System.out.println(c2.c1 == c2clone.c1); // prints true
c2.c1.o = new Object(); // modified both c2 and c2clone!!!
La dernière ligne modifier à la fois c2 et c2clone parce que les deux points à la même instance de c1. Si vous voulez que la dernière ligne ne modifie que c2, alors vous devez faire ce que nous appelons une copie profonde .
Je vous conseille de ne pas utiliser le paradigme clone, il est très difficile d'obtenir le droit. Faites-vous une faveur et passez à copier des constructeurs. Voir aussi: http://www.javapractices.com/topic/TopicAction.do?Id=71 –