Clonage profond [Résolu]

Messages postés
41
Date d'inscription
vendredi 6 février 2004
Dernière intervention
11 août 2008
- - Dernière réponse : super_toinou
Messages postés
764
Date d'inscription
mardi 25 mai 2004
Dernière intervention
8 mars 2011
- 6 nov. 2006 à 11:15
Bonjour,

Je désirerais faire un clonage profond d'un objet "Plateau" qui contient  une unique propriété : un int[][] nommé "plateau".
Or si j'ai bien réussi a cloner l'objet "Plateau" et le conteneur "plateau", les valeurs de "plateau" sont une même instance et donc un simple clonage de surface. C'est mon System.arraycopy qui visiblement fait une copie par référence et qui ne va pas !! Quelqu'un aurait-il une solution ?

    public Plateau clone() throws CloneNotSupportedException {
        Plateau p = null;
        try {
            p = (Plateau)super.clone();
            p.setPlateau((int[][])this.getPlateau().clone());
            System.arraycopy(getPlateau(), 0, p.getPlateau(), 0 , getPlateau().length);
        }
        catch(CloneNotSupportedException cnse) {
            cnse.printStackTrace();
        }
        return p;
    }

-------------------------------------------------------------------------
le code complet :
-------------------------------------------------------------------------
public class Plateau implements Cloneable {
    /* données membres */
    private int plateau[][];
   
       
    /* constructeurs */
    public Plateau() {
        this.plateau = new int[4][4];
    }

   
    /* getters & setters */
    public int[][] getPlateau() {
        return this.plateau;
    }

    public void setPlateau(int[][] plateau) {
        this.plateau = plateau;
    }

    public int getValeur(int x, int y) {
        return this.plateau[x][y];
    }
   
    public void setValeur(int x, int y, int valeur) {
        this.plateau[x][y] = valeur;
    }

   

    /* méthodes public */

    public void affichePlateauDeJeu() {
        String chaine[] = this.pourVisualisationPlateauDeJeu();
        for (int i=1 ; i <=3 ; i++) {
            System.out.println(chaine[i]);
        }
    }
   
   
    /**
     * @return un tableau de String contenant la visualisation du plateau de jeu
     */
    public String[] pourVisualisationPlateauDeJeu() {
        char[] symbole = new char[2];
        symbole[0] = ' ';
        symbole[1] = 'X';
        String chaine[] = new String[4];
        char temp;
        for (int h=1 ; h<=3 ; h++) {
            chaine[h]= new String("");
            for (int l=1 ; l<=3 ; l++) {
                temp = symbole[plateau[l][h]];
                chaine[h]+="|"+temp;
            }
            chaine[h]+="|";
            chaine[h]+="    ";
        }
        return chaine;
    }
   
   
   
    public Plateau clone() throws CloneNotSupportedException {
        Plateau p = null;
        try {
            p = (Plateau)super.clone();
            p.setPlateau((int[][])this.getPlateau().clone());
            System.arraycopy(getPlateau(), 0, p.getPlateau(), 0 , getPlateau().length);
        }
        catch(CloneNotSupportedException cnse) {
            cnse.printStackTrace();
        }
        return p;
    }
}

public class Demo {
    public static void main(String[] args) {
        Plateau p = new Plateau();
        p.setValeur(2, 1, 1);
        p.affichePlateauDeJeu();
        System.out.println("");
       
        Plateau p2 = null;
        try {
            p2 = p.clone();
        } catch (CloneNotSupportedException e) {
            // TODO Bloc catch auto-généré
            e.printStackTrace();
        }
        p2.setValeur(1, 1, 1);
       
        p.affichePlateauDeJeu();
        System.out.println("p:"+p);
        int[][] t = p2.getPlateau();
        System.out.println("p.getPlateau():" + t);
        System.out.println(""+t[0]);
       
        p2.affichePlateauDeJeu();
        System.out.println("p2:"+p2);
        int[][] t2 = p2.getPlateau();
        System.out.println("p2.getPlateau():" + t2);
        System.out.println(""+t2[0]);
    }
}
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Messages postés
41
Date d'inscription
vendredi 6 février 2004
Dernière intervention
11 août 2008
3
Merci
Copier les valeurs une a une dans une nouvelle instance de int[][] :

public PlateauDeJeu clone() throws CloneNotSupportedException {
        PlateauDeJeu p = null;
        try {
            // On récupère l'instance à renvoyer par l'appel de la
            // méthode super.clone()
            p = (PlateauDeJeu)super.clone();
            
            p.plateau = new int[4][4];
            
            for (int i = 0 ; i < 4 ; i++) {
                for (int j = 0 ; j < 4 ; j++) {
                    if (getValeur(i, j) == 0) p.setValeur(i, j, 0);
                    if (getValeur(i, j) == 1) p.setValeur(i, j, 1);
                    if (getValeur(i, j) == 7) p.setValeur(i, j, 7);
                }
            }
        }
        catch(CloneNotSupportedException cnse) {
            cnse.printStackTrace(System.err);
        }

        return p;
    }

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de 3615jenveux
Messages postés
764
Date d'inscription
mardi 25 mai 2004
Dernière intervention
8 mars 2011
0
Merci
Hello,
un ptit tips,

Pour pas te prendre la tete, t utilise SerializationUtils.clone d apache (org.apache.commons.lang.SerializationUtils), il faut juste que ta classe soit serializable et t aura un clonage profond à n niveau qui sera fait (si t as des objets non sérializable je crois qu il seront squizzés (a la maniere de transient)
Comme ca si tu rajoute des trucs dans ta classe t aura pas a retoucher ton code !

++ Toinou
Commenter la réponse de super_toinou

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.