Cloner un objet en Java
- Utiliser la méthode directe pour cloner un objet en Java
-
Utilisez la fonction
clone()
pour cloner un objet en Java - Utiliser un constructeur de copie pour cloner un objet en Java
Le clonage d’objet est une technique permettant de créer une copie exacte d’un objet. Il crée une nouvelle instance de la classe de l’objet courant et remplit tous ses champs avec le contenu exact des champs de l’objet courant.
Dans ce tutoriel, nous allons cloner un objet en Java.
Utiliser la méthode directe pour cloner un objet en Java
Dans cette méthode, nous allons créer un nouvel objet et affecter un objet précédemment défini comme valeur.
Voir l’exemple suivant.
public class shallowcopy implements Cloneable {
int a, b;
public static void main(String args[]) throws CloneNotSupportedException {
shallowcopy d = new shallowcopy();
d.a = 10;
d.b = 12;
shallowcopy dtwo = d;
System.out.println("Original " + d.a);
System.out.println(d.b);
System.out.println("Shallow Copy " + dtwo.a);
System.out.println(dtwo.b);
d.a = 5;
System.out.println("Copy after modifying original");
System.out.println(dtwo.a);
}
}
Production:
Original 10
12
Shallow Copy 10
12
Copy after modifying original
5
Dans le code ci-dessus, nous avons modifié l’original et vu les modifications reflétées dans la copie créée. Un tel clone est appelé une copie superficielle.
Avant de renvoyer une nouvelle instance de la même classe, la copie superficielle produit une nouvelle instance de la même classe et copie ses champs. Le contenu d’un objet est transféré vers un nouvel objet dans cette procédure. Cependant, les deux objets font référence aux mêmes valeurs, donc toute modification apportée aux objets liés sera reflétée dans les autres. La classe d’objets a une fonction de clonage ainsi qu’une capacité de copie superficielle. La classe d’objets a une fonction de clonage ainsi qu’une capacité de copie superficielle.
Utilisez la fonction clone()
pour cloner un objet en Java
Pour cloner un objet, utilisez la méthode clone()
de la classe Object. C’est le moyen le plus rapide de dupliquer un tableau.
La classe dont nous souhaitons générer le clone d’objet doit implémenter l’interface Cloneable. Si l’interface Cloneable n’est pas implémentée, la fonction clone()
lève une CloneNotSupportedException
.
La fonction clone()
élimine le besoin de traitement supplémentaire lors de la création d’une réplique exacte d’un objet. Si nous le faisons en utilisant new
, le traitement prendra beaucoup de temps, c’est pourquoi nous utilisons plutôt le clonage d’objets. Nous l’utiliserons pour créer une copie profonde.
Lorsqu’un élément est dupliqué avec les objets auxquels il fait référence, cela s’appelle une copie profonde. Les modifications apportées à la copie ne se reflètent pas sur l’original.
Par example,
import java.util.ArrayList;
public class deepcopy implements Cloneable {
int a, b;
public Object clone() throws CloneNotSupportedException {
return (deepcopy) super.clone();
}
public static void main(String args[]) throws CloneNotSupportedException {
deepcopy d = new deepcopy();
d.a = 10;
d.b = 12;
System.out.println("Original " + d.a);
System.out.println(d.b);
deepcopy dtwo = (deepcopy) d.clone();
System.out.println("Deep Copy " + dtwo.a);
System.out.println(dtwo.b);
d.a = 5;
System.out.println("Copy after modifying original");
System.out.println(dtwo.a);
}
}
Production:
Original 10 12 Deep Copy 10 12 Copy after modifying original 10
Dans l’exemple ci-dessus, les modifications apportées à l’original ne sont pas reflétées dans la copie complète.
Utiliser un constructeur de copie pour cloner un objet en Java
Un constructeur initialise un objet d’une certaine classe. Le constructeur de copie peut créer un objet en double d’une certaine classe.
Voir le code ci-dessous pour voir comment initialiser une telle classe.
class copycon {
public String cc;
public copycon(String s) {
this.cc = s;
}
public copycon(copycon different) {
this.cc = different.cc; // copy constructor
}
}
class Main {
public static void main(String args[]) {
copycon c1 = new copycon("abc");
copycon c2 = new copycon(c1);
System.out.println(c2.cc);
}
}
Production:
abc
Cela ne permettrait pas d’obtenir un clonage en profondeur en Java.