Clonage profond [Résolu]

3615jenveux 41 Messages postés vendredi 6 février 2004Date d'inscription 11 août 2008 Dernière intervention - 5 nov. 2006 à 21:38 - Dernière réponse : super_toinou 764 Messages postés mardi 25 mai 2004Date d'inscription 8 mars 2011 Dernière intervention
- 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
3615jenveux 41 Messages postés vendredi 6 février 2004Date d'inscription 11 août 2008 Dernière intervention - 5 nov. 2006 à 23:36
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;
    }

Merci 3615jenveux 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de 3615jenveux
super_toinou 764 Messages postés mardi 25 mai 2004Date d'inscription 8 mars 2011 Dernière intervention - 6 nov. 2006 à 11:15
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.