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 :
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);
...
}
Cette méthode si situe dans ma classe Echiquier, et cette classe étend Cloneable.
Voici les attributs principaux de ma classe Echiquier :
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 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
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) ...
}
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
 
// 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;
    }
-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)

Merci pour les personnes qui prendront le temps de regarder mon portable et me proposer une solution !