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]);
}
}