3615jenveux
Messages postés41Date d'inscriptionvendredi 6 février 2004StatutMembreDernière intervention11 août 2008
-
5 nov. 2006 à 21:38
super_toinou
Messages postés764Date d'inscriptionmardi 25 mai 2004StatutMembreDernière intervention 8 mars 2011
-
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 ?
-------------------------------------------------------------------------
le code complet :
-------------------------------------------------------------------------
public class Plateau implements Cloneable {
/* données membres */
private int plateau[][];
/* constructeurs */
public Plateau() {
this.plateau = new int[4][4];
}
public class Demo {
public static void main(String[] args) {
Plateau p = new Plateau();
p.setValeur(2, 1, 1);
p.affichePlateauDeJeu();
System.out.println("");
3615jenveux
Messages postés41Date d'inscriptionvendredi 6 février 2004StatutMembreDernière intervention11 août 2008 5 nov. 2006 à 23:36
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);
}
super_toinou
Messages postés764Date d'inscriptionmardi 25 mai 2004StatutMembreDernière intervention 8 mars 20116 6 nov. 2006 à 11:15
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 !