- Énoncé : Vous devez créer une classe
Personne
qui contient les attributs suivants : nom, prénom, âge et adresse. La classe doit implémenter l’interfaceCloneable
et avoir une méthodeclone()
qui renvoie une copie de l’objet courant. Cette méthode doit utilisersuper.clone()
pour cloner l’objet et ensuite copier manuellement tous les attributs de la classe. - Consignes :
- Définissez la classe
Personne
avec les attributs et les méthodes demandés. - Implémentez l’interface
Cloneable
dans la classePersonne
. - Créez une méthode
clone()
dans la classePersonne
qui renvoie une copie de l’objet courant. - Utilisez
super.clone()
pour cloner l’objet et copiez ensuite manuellement tous les attributs de la classe. - Testez votre implémentation en créant une instance de la classe
Personne
, en la clonant et en comparant les deux objets.
- Exemple de solution :
public class Personne implements Cloneable {
private String nom;
private String prenom;
private int age;
private String adresse;
public Personne(String nom, String prenom, int age, String adresse) {
this.nom = nom;
this.prenom = prenom;
this.age = age;
this.adresse = adresse;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getPrenom() {
return prenom;
}
public void setPrenom(String prenom) {
this.prenom = prenom;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAdresse() {
return adresse;
}
public void setAdresse(String adresse) {
this.adresse = adresse;
}
@Override
public Object clone() throws CloneNotSupportedException {
Personne clone = (Personne) super.clone();
clone.setNom(this.nom);
clone.setPrenom(this.prenom);
clone.setAge(this.age);
clone.setAdresse(this.adresse);
return clone;
}
@Override
public String toString() {
return "Personne [nom=" + nom + ", prenom=" + prenom + ", age=" + age + ", adresse=" + adresse + "]";
}
}
Dans cet exemple, la classe Personne
implémente l’interface Cloneable
, ce qui signifie que nous pouvons utiliser la méthode clone()
pour créer une copie de l’objet courant. Nous utilisons super.clone()
pour cloner l’objet, puis nous copions manuellement tous les attributs de la classe. Enfin, nous retournons une copie de l’objet cloné.
Pour tester notre implémentation, nous pouvons créer une instance de la classe Personne
, la cloner, puis comparer les deux objets pour voir s’ils sont égaux :
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Personne p1 = new Personne("FADI", "ABDO", 31, "237 Saada 1 - El jadaida");
Personne p2 = (Personne) p1.clone();
}
}
La méthode clone()
de l’exemple que j’ai fourni effectue une copie profonde de l’objet Personne
. Cela signifie que tous les attributs de l’objet sont clonés, y compris les objets référencés. Si la méthode clone()
se contentait de retourner (Personne) super.clone();
, cela produirait une copie superficielle de l’objet, où les objets référencés ne seraient pas clonés.
En effet, lorsqu’on utilise super.clone()
, la méthode de la classe parente est appelée, qui effectue une copie superficielle de l’objet. Ensuite, dans la méthode clone()
de la classe Personne
, on effectue une copie profonde en clonant les objets référencés par les attributs de la classe. Cela permet de garantir que les objets référencés par l’objet original et l’objet cloné sont indépendants les uns des autres.
Par conséquent, pour assurer une copie profonde de l’objet Personne
, il est nécessaire de redéfinir la méthode clone()
et de cloner tous les objets référencés dans l’objet original.
Voici une implémentation de la méthode clone()
pour la classe Personne
qui effectue une copie superficielle de l’objet :
public Object clone() throws CloneNotSupportedException {
return super.clone();
}