Le clonage est un paradigme de programmation. Le fait que Java peut avoir mis en œuvre mal dans beaucoup de façons de ne pas du tout diminuer le besoin de clonage. Et, il est facile à mettre en œuvre le clonage qui fonctionnera, toutefois, vous voulez que cela fonctionne, peu profond, profond, mixte, que ce soit. Vous pouvez même utiliser le nom de clone de la fonction et de ne pas mettre en œuvre Clonable si vous le souhaitez.
Supposons que j'ai des classes A, B, et C, où B et C sont des dérivés de A. Si j'ai une liste d'objets de type A comme ceci:
ArrayList<A> list1;
Maintenant, cette liste peut contenir des objets de type A, B ou C. Vous ne savez pas quel type les objets. Donc, vous ne pouvez pas copier la liste comme ceci:
ArrayList<A> list2 = new ArrayList<A>();
for(A a : list1) {
list2.add(new A(a));
}
Si l'objet est en fait de type B ou C, vous n'aurez pas le droit de copie. Et, si l'Un est abstrait? Maintenant, certaines personnes ont suggéré ceci:
ArrayList<A> list2 = new ArrayList<A>();
for(A a : list1) {
if(a instanceof A) {
list2.add(new A(a));
} else if(a instanceof B) {
list2.add(new B(a));
} else if(a instanceof C) {
list2.add(new C(a));
}
}
C'est une très, très mauvaise idée. Si vous ajoutez un nouveau type dérivé? Que faire si B ou C sont dans un autre paquet, et vous n'avez pas accès à cette classe?
Ce que vous voulez faire est ceci:
ArrayList<A> list2 = new ArrayList<A>();
for(A a : list1) {
list2.add(a.clone());
}
Beaucoup de personnes ont indiqué pourquoi la base Java mise en œuvre de clone est problématique. Mais, il est facilement surmonter cette façon:
Dans la classe A:
public A clone() {
return new A(this);
}
Dans la classe B:
@Override
public B clone() {
return new B(this);
}
Dans la classe C:
@Override
public C clone() {
return new C(this):
}
Je ne suis pas la mise en œuvre de Clonable, juste en utilisant le même nom de fonction. Si vous n'aimez pas que, nom de quelque chose d'autre.