Création de constructeurs de copie en Java

JavaBeginner
Pratiquer maintenant

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.