Bonjour à tous !
J'ai un petit problème pour cloner un objet. J'ai lu le tuto de Yann D'Isanto dans les cours de Java , mais rien n'y fait.
J'ai plusieurs questions :
- Est-ce que l'on peut cloner un objet dans une méthode de la classe de cet objet ? (une méthode qui appartient à cet objet) ou il faut le faire dans une classe extérieure ? (ce qui m'arrangerait pas du tout)
- Et ensuite, voici mon problème. J'ai l'impression que le clone de mon objet Echiquier ne marche pas, pourtant, aucune exception ne survient pendant l'opération. En fait, il attribue mon objet Echiquier à l'objet EchiquierCloné, c'est à dire qu'il modifie l'objet original.
Voici mon code :
Cette méthode si situe dans ma classe Echiquier, et cette classe étend Cloneable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public boolean uneMethode() { ... // TODO: Le clone de l'échiquier marche pas ! Ca modifie le véritable échiquier ?! // On clone l'échiquier Echiquier echiquierClone = (Echiquier) this.clone(); // On joue un coup virtuellement echiquierClone.joueCoup(position, autrePosition); ... }
Voici les attributs principaux de ma classe Echiquier :
Et ce tableau de Cases est initialisé comme ça dans mon constructeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 // La taille du plateau est une constante public static final int TAILLE_PLATEAU = 8; // L'échiquier possède un tableau de cases private Case plateau[][] = new Case[TAILLE_PLATEAU][TAILLE_PLATEAU];
Et enfin, voici la méthode clone() dans toujours la même classe (Echiquier) :
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 int camp; // 0 => blanc ; 1 => noir for(camp = 0; camp < 2; camp++) { final int dernierNumero = TAILLE_PLATEAU - 1; final int ligneArriere = camp * dernierNumero; final int ligneAvant = 1 + camp * (TAILLE_PLATEAU - 3); final boolean couleurNoire = (camp == 1); // Figures plateau[ligneArriere][0] = new Case(ligneArriere, 0, new Tour(couleurNoire, "T")); plateau[ligneArriere][7] = new Case(ligneArriere, 7, new Tour(couleurNoire, "T")); plateau[ligneArriere][2] = new Case(ligneArriere, 2, new Fou(couleurNoire, "F")); plateau[ligneArriere][5] = new Case(ligneArriere, 5, new Fou(couleurNoire, "F")); plateau[ligneArriere][3] = new Case(ligneArriere, 3, new Dame(couleurNoire, "D")); plateau[ligneArriere][4] = new Case(ligneArriere, 4, new Roi(couleurNoire, "R")); plateau[ligneArriere][1] = new Case(ligneArriere, 1, new Cavalier(couleurNoire, "C")); plateau[ligneArriere][6] = new Case(ligneArriere, 6, new Cavalier(couleurNoire, "C")); // Pions plateau[ligneAvant][0] = new Case(ligneAvant, 0, new Pion(couleurNoire, "")); plateau[ligneAvant][1] = new Case(ligneAvant, 1, new Pion(couleurNoire, "")); plateau[ligneAvant][2] = new Case(ligneAvant, 2, new Pion(couleurNoire, "")); plateau[ligneAvant][3] = new Case(ligneAvant, 3, new Pion(couleurNoire, "")); plateau[ligneAvant][4] = new Case(ligneAvant, 4, new Pion(couleurNoire, "")); plateau[ligneAvant][5] = new Case(ligneAvant, 5, new Pion(couleurNoire, "")); plateau[ligneAvant][6] = new Case(ligneAvant, 6, new Pion(couleurNoire, "")); plateau[ligneAvant][7] = new Case(ligneAvant, 7, new Pion(couleurNoire, "")); // Aperçu du tableau de positions des pièces // ... ... ... ... // (2,0) (2,1) (2,2) ... // (1,0) (1,1) (1,2) ... // (0,0) (0,1) (0,2) ... }
-Est ce que les classes Case, Pion, Tour, Fou, Dame, Roi et Cavalier doivent aussi étendre Cloneable ? (Ce n'est pas le cas pour l'instant)
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 // Clone l'objet echiquier // TODO: Marche pas ! @Override public Object clone() { Echiquier echiquier = null; try { echiquier = (Echiquier) super.clone(); } catch (CloneNotSupportedException exception) { System.err.println("" + exception.getMessage()); } // On clone le plateau de jeu echiquier.plateau = (Case[][]) plateau.clone(); // TODO: Il faut peut être ici cloné aussi les pièces du plateau // mais comment faire ? // On retourne l'échiquier cloné return echiquier; }
Merci pour les personnes qui prendront le temps de regarder mon portable et me proposer une solution !
Partager