IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Problème de clonage d'objet !


Sujet :

avec Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Problème de clonage d'objet !
    Bonjour je viens de commencer le java, et pour m'entrainer je veux faire une IA qui joue au morpion.
    Mais je cale sur un point:
    J'ai une classe "Board" que je veux cloner, elle est bien cloné sauf que celle-ci possède un tableau à 2 dimension d'objets "ElementBoard" qui eux, ne son pas cloné...

    Bon bah je vous passe le code (enfaite il y aussi 2 classe "MorpionSquareBoard" qui hérite de "SquareBord" qui hérite de "Board" et une classe "MorpionElementBoard" qui hérite de "ElementBoard"):
    Board
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    package jmorpion;
     
    import java.util.logging.Level;
    import java.util.logging.Logger;
     
    /**
     *
     * @author root
     */
    public class Board implements Cloneable {
     
        protected ElementBoard[][] board;
        protected int weight;
        protected int height;
     
        public Board(int _weight, int _height) {
            board = (ElementBoard[][]) new ElementBoard[_weight][_height];
            weight = _weight;
            height = _height;
        }
     
        public ElementBoard get(int x, int y) {
            return board[x][y];
        }
     
        public void showBoard() {
            for (ElementBoard[] line : board) {
                for (ElementBoard element : line) {
                    System.out.print("  " + element.toString() + "  ");
                }
                System.out.println();
            }
            System.out.println();
        }
     
        protected void put(ElementBoard element, int x, int y) {
            board[x][y] = element;
        }
     
        protected void putAll(ElementBoard element) {
            for (int x = 0; x < weight; x++) {
                for (int y = 0; y < height; y++) {
                    put(element, x, y);
                }
            }
        }
     
        public int getHeight() {
            return height;
        }
     
        public int getWeight() {
            return weight;
        }
     
        public void setWeight(int weight) {
            this.weight = weight;
        }
     
        @Override
        public Board clone() {
            Board boardClone = null;
            try {
                boardClone = (Board) super.clone();
            } catch (CloneNotSupportedException ex) {
                Logger.getLogger(MorpionSquareBoard.class.getName()).log(Level.SEVERE, null, ex);
            }
            for (int x = 0; x < weight; x++) {
                for (int y = 0; y < height; y++) {
                    boardClone.board[x][y] = (ElementBoard) board[x][y].clone();
                }
            }
            return boardClone;
        }
    }
    SquareBoard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    package jmorpion;
     
    /**
     *
     * @author root
     */
    public class SquareBoard extends Board {
     
        public SquareBoard(int size) {
            super(size, size);
        }
     
        @Override
        public SquareBoard clone() {
            return (SquareBoard) super.clone();
        }
    }
    MorpionSquareBoard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    package jmorpion;
     
    import java.util.logging.Level;
    import java.util.logging.Logger;
    }
    /**
     *
     * @author root
     */
    public final class MorpionSquareBoard extends SquareBoard {
     
        public MorpionSquareBoard(int size) {
            super(size);
            try {
                putAll(new MorpionElementBoard(0));
            } catch (Exception ex) {
                Logger.getLogger(MorpionSquareBoard.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
     
        @Override
        public MorpionSquareBoard clone() {
            return (MorpionSquareBoard) super.clone();
        }
    }
    ElementBoard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    package jmorpion;
     
    import java.util.logging.Level;
    import java.util.logging.Logger;
     
    /**
     *
     * @author root
     */
    public class ElementBoard<ElementObject> implements Cloneable {
     
        protected ElementObject element;
     
        public ElementBoard(ElementObject _element) {
            element = _element;
        }
     
        public ElementObject getValue() {
            return element;
        }
     
        @Override
        public String toString() {
            return element.toString();
        }
     
        @Override
        public ElementBoard clone() {
            ElementBoard elementBoard = null;
            try {
                elementBoard = (ElementBoard) super.clone();
            } catch (CloneNotSupportedException ex) {
                Logger.getLogger(MorpionSquareBoard.class.getName()).log(Level.SEVERE, null, ex);
            }
            return elementBoard;
        }
    }
    MorpionElementBoard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    package jmorpion;
     
    /**
     *
     * @author root
     */
    public class MorpionElementBoard extends ElementBoard<Integer> {
     
        public MorpionElementBoard(int value) throws Exception {
            super(value);
            if (value > 3 || value < 0) {
                throw new Exception("Valeur invalide: " + value);
            }
        }
     
        @Override
        public MorpionElementBoard clone() {
            return (MorpionElementBoard) super.clone();
        }
    }
    (j'espère que c'est pas trops gros :p )

    Pour tester tout ca je fait un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    package jmorpion;
     
    /**
     *
     * @author root
     */
    public class Main {
     
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) throws Exception {
            MorpionSquareBoard morpionSquareBoard = new MorpionSquareBoard(3);
            MorpionSquareBoard newMorpionSquareBoard = morpionSquareBoard.clone();
     
            System.out.println("Plateau de l'objet avant le put() sur le nouvelle objet: ");
            morpionSquareBoard.showBoard();
            newMorpionSquareBoard.put(new MorpionElementBoard(1), 1, 1);
            System.out.println("Plateau de l'objet après le put() sur le nouvelle objet: ");
            morpionSquareBoard.showBoard();
     
            System.out.println("Weight du nouvelle objet avant le put sur l'ancien: " + newMorpionSquareBoard.getWeight());
            morpionSquareBoard.setWeight(100);
            System.out.println("Weight du nouvelle objet près le put sur l'ancien: " + newMorpionSquareBoard.getWeight());
     
        }
    }
    Et j'obtiens:
    run:
    Plateau de l'ancien objet avant le put() sur le nouvelle objet:
    0 0 0
    0 0 0
    0 0 0

    Plateau de l'ancien objet après le put() sur le nouvelle objet:
    0 0 0
    0 1 0
    0 0 0

    Weight du nouvelle objet avant le put sur l'ancien: 3
    Weight du nouvelle objet après le put sur l'ancien: 3
    BUILD SUCCESSFUL (total time: 0 seconds)
    Logiquement le tableau ne devrais pas changer mais la ce n'est pas le cas et pourtant la variable weight (je l'ai pris au hazart) ne change pas !

    Je suis complètement perdu ca fait un bon moment que je cherche mais j'ai rien trouvé ...
    Merci d'avance pour ceux qui prendront la peine de lire tout le code ^^

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Lorsque tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boardClone = (Board) super.clone();
    le clonage ne se fait pas en profondeur. Les attribut sont copié tels quels. Le clone et l'original partagent donc le même tableau

    Avant de cloner le contenu du tableau, il conviens de créer dans le clone un nouveau tableau, via un appel à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boardClone.board = new ElementBoard[width][height]
    pour avoir un nouveau tableau.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Ca marche !
    Merci tchize_, je ne savais pas ca.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème pour reattacher un objet à une session
    Par K-Kaï dans le forum Hibernate
    Réponses: 2
    Dernier message: 05/07/2006, 15h16
  2. Problème d'accès à un objet!
    Par chrono23 dans le forum C++
    Réponses: 21
    Dernier message: 26/06/2006, 20h21
  3. [Sécurité] Problème de récupération d'objet sérialisé
    Par Mysticlolly dans le forum Langage
    Réponses: 6
    Dernier message: 31/03/2006, 14h16
  4. [hibernate]Problème de récupération d'objet...
    Par roxx62 dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/07/2005, 11h36
  5. Réponses: 14
    Dernier message: 02/03/2005, 18h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo