Accueil
 Sommaire du cours
 1  Introduction à Java
 2  Concepts de bases de Java
 3  Classes et objets en Java
 4  Généralisation spécialisation en Java
 5  Organisation des sources Java
 6  API Java
 7  Exceptions en Java
 8  Concepts objets avancés en Java
 8.1  Copie simple/légère
 8.1.1  Copie pour studs
 8.1.2  Représentation graphique d'une copie légère dans studs
 8.1.3  Exemple de copie légère
 8.1.4  Représentation graphique d'une copie plus profonde dans studs
 8.1.5  Copie plus profonde dans studs
 8.1.6  Représentation graphique d'une copie profonde
 8.1.7  Clone de Scrutin
 8.1.8  Clone en copie profonde de Personne
 8.1.9  Suite exemple de copie profonde
 8.2  Retour sur \texttt hashCode()
 8.3  Retour sur les exceptions
 Bibliographie

 Contacts

W3C validator

Département INF  
 Conception et programmation orientées objet


8.1.8 Clone en copie profonde de Personne
 
package studsclone; 
import java.util.ArrayList; 
import studsabstract.Bulletin; 
4public class Personne implements Cloneable { 
    private String nom, prenom; 
    private int nbParticipations = 0, nbOrg = 0; 
    private ArrayList<Scrutin> scrutins; 
8    public Personne(final String n, final String p) { 
        this.nom = n; 
        this.prenom = p; 
        scrutins = new ArrayList<Scrutin>(); 
12    } 
    public Scrutin organiserScrutin(final String nom) { 
        Scrutin s = new Scrutin(nom,this); 
        scrutins.add(s); 
16        nbOrg ++; 
        return s; 
    } 
    /** le clonage est profond, il duplique les objets references. 
20     * Ce nest pas nÃľcessaire pour les objets du type String 
     * du fait quun String est non modifiable. 
     */ 
    @Override 
24    public Personne clone() throws CloneNotSupportedException { 
        Personne cl = new Personne(nom, prenom); 
        cl.nbParticipations = nbParticipations; 
        cl.nbOrg = nbOrg; 
28        for (Scrutin scr : scrutins ) { 
            Scrutin sclone = scr.clone(); 
            sclone.setOrganisateur(cl); 
            cl.scrutins.add(sclone); 
32        } 
        return cl; 
    } 
    public String getNom() { return nom; } 
36    public String getPrenom() {return prenom; } 
    public ArrayList<Scrutin> getScrutins() {return scrutins; } 
    public void voter(final Bulletin b){ } 
    public void consulterResultat(Scrutin s) { } 
40    public void seRetirerDUnScrutin(Scrutin s) { } 
}

    précédent     suivant 


Pour ce qui est de la personne, nous voulons la cloner et elle contient une liste des scrutins qu’elle a organisés. Il faut donc que nous dupliquions cette liste, ce qui est possible puisqu’elle implémente l’interface Cloneable. Il faut, cependant que la duplication soit profonde c’est-à-dire que nous dupliquions les entrées de la liste.

Cette duplication profonde, commence par cloner l’objet courant. Pour cela elle crée un objet copie par appel d’un constructeur à la ligne 23, auquel elle passe les paramètres nom et prenom. Elle modifie ensuite les attributs nbOrg et nbParticipations en y mettant les valeurs des attributs correspondant dans l’objet courant. Ensuite, à la ligne 25, la méthode parcourt les scrutins un à un. Pour chaque scrutin, un clone du scrutin est construit à la ligne 26. L’organisateur de ce scrutin cloné est associé avec la personne en cours de clonage par la méthode setOrganisateur.

Christian Bac, Denis Conan, Télécom SudParis, CSC 4002, Octobre 2015