Introduction
Dans ce laboratoire, nous allons apprendre à créer des constructeurs de copie en Java. Les constructeurs de copie sont utilisés pour créer un nouvel objet à partir des valeurs d'un objet existant. Les constructeurs de copie peuvent être utilisés pour créer des clones superficiels et profonds. Nous allons créer des constructeurs de copie pour des classes simples et des classes avec des types de référence.
Créer une classe simple
Créez une classe simple Student avec un champ name et gpa. Nous utiliserons cette classe pour créer un constructeur de copie.
class Student {
private String name;
private double gpa;
// constructeur paramétré
Student(String name, double gpa) {
this.name = name;
this.gpa = gpa;
}
}
Créer un constructeur de copie pour une classe simple
Créez un constructeur de copie pour la classe Student. Le constructeur de copie devrait prendre un objet de la classe en entrée et devrait initialiser les champs en utilisant les valeurs de l'objet d'entrée.
// Constructeur de copie
Student(Student s) {
this.name = s.getName();
this.gpa = s.getGpa();
}
// Accesseurs
public String getName() {
return name;
}
public double getGpa() {
return gpa;
}
Créer un objet et le cloner
Créez un objet de la classe Student puis créez un clone de cet objet à l'aide du constructeur de copie. Changez le nom de l'objet original et affichez les noms des deux objets pour voir si l'objet cloné a été affecté.
Student s = new Student("John", 3.5);
Student s2 = new Student(s);
s.setName("Sarah");
System.out.println("Original: " + s.getName());
System.out.println("Clone: " + s2.getName());
Créer une classe avec des types de référence
Créez une classe Student qui contient un type de référence (Address) en tant que champ. Nous utiliserons cette classe pour démontrer la différence entre le clonage superficiel et le clonage profond.
class Student {
private String name;
private double gpa;
private Address address;
// constructeur paramétré
Student(String name, double gpa, Address address) {
this.name = name;
this.gpa = gpa;
this.address = address;
}
}
class Address {
private int postalCode;
Address(int postalCode) {
this.postalCode = postalCode;
}
}
Créer un constructeur de copie superficielle
Créez un constructeur de copie superficielle pour la classe Student. Le constructeur de copie superficielle devrait seulement assigner des références aux champs de type de référence.
Student(Student s) {
this.name = s.getName();
this.gpa = s.getGpa();
this.address = s.getAddress();
}
Démontrer le clonage superficiel
Créez un objet Student puis un clone à l'aide du constructeur de copie superficielle. Changez le code postal de l'adresse de l'objet original et affichez les deux codes postaux pour montrer que l'objet cloné est affecté par les modifications apportées à l'original.
Student s = new Student("John", 3.5, new Address(12345));
Student s2 = new Student(s);
s.getAddress().setPostalCode(54321);
System.out.println("Original: " + s.getAddress().getPostalCode());
System.out.println("Clone: " + s2.getAddress().getPostalCode());
Créer un constructeur de copie profonde
Créez un constructeur de copie profonde pour la classe Student. Le constructeur de copie profonde devrait créer de nouveaux objets pour les champs de type de référence.
Student(Student s) {
this.name = s.getName();
this.gpa = s.getGpa();
this.address = new Address(s.getAddress().getPostalCode());
}
// accesseurs
public Address getAddress() {
return address;
}
Démontrer le clonage profond
Créez un objet Student puis un clone à l'aide du constructeur de copie profonde. Changez le code postal de l'adresse de l'objet original et affichez les deux codes postaux pour montrer que l'objet cloné n'est pas affecté par les modifications apportées à l'original.
Student s = new Student("John", 3.5, new Address(12345));
Student s2 = new Student(s);
s.getAddress().setPostalCode(54321);
System.out.println("Original: " + s.getAddress().getPostalCode());
System.out.println("Clone: " + s2.getAddress().getPostalCode());
Résumé
Dans ce laboratoire, nous avons appris à créer des constructeurs de copie en Java. Les constructeurs de copie peuvent être utilisés pour créer des clones profonds et superficiels d'objets. Nous avons également comparé les constructeurs de copie avec la méthode clone() et discuté des problèmes d'héritage liés aux constructeurs de copie. La création de constructeurs de copie est un moyen élégant et simple de cloner des objets.



