Problème de référence

cs_Taz1984 Messages postés 47 Date d'inscription lundi 20 juillet 2009 Statut Membre Dernière intervention 13 mars 2013 - 10 mai 2010 à 09:42
cs_Taz1984 Messages postés 47 Date d'inscription lundi 20 juillet 2009 Statut Membre Dernière intervention 13 mars 2013 - 10 mai 2010 à 16:49
Bonjour,

J'ai un problème au niveau de la référence des objets en java.

Supposons que j'ai 3 objets . (X , A , B)

Si je fais A X et B X ;

Lors du programme je modifie l'objet A , du coup l'objet B est modifié automatiquement.

Comment puis je faire pour que A et B pointent vers une zone mémoire différentes tout en ayant les mêmes données.

j'ai vu sur internet que je dois utiliser le clone(). j'ai pas très bien compris ce concept , y aurais t il un autre moyen ?

Merci d'avance

6 réponses

cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
10 mai 2010 à 10:37
Salut,

Effectivement il faut faire un clone.

Le principe est simple : tu surcharges la méthode clone du type de X.

@Override
public Type clone() {

Type clone = new Type();

clone.setAttribut1(attribut1.clone());
clone.setAttribut2(attribut2.clone());
clone.setInt1(int1);
...
clone.setString1(string1.clone());
...

return clone;

}

Ensuite si tu veux 3 objets distincts en mémoire tu fais :

Type a = x.clone();
Type b = x.clone();

Selon tes besoins, tu devras peut-être aussi cloner les attributs non primitifs car même si a !b il est possible que a.c b.c.

Le mieux est encore que tu nous montres la classe en question. Un exemple sera plus parlant.

Jonathan
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
10 mai 2010 à 10:39
Salut,

La fonction clone te permet d'obtenir une nouvelle instance avec les mêmes données (copie profonde), il faut que ta classe implémente l'interface Cloneable:

public class UneClasseCloneable implements Cloneable {
private String unChampString;
private Double unChampDouble;
private UneAutreClasseCloneable unChampCloneable;

/* implémentation des getters et des setters */

public Object clone() {
  UneClasseCloneable resultat = new UneClasseCloneable();
  resultat.setUnChampString(this.unChampString);
  resultat.setUnChampDouble(this.unChampDouble);
  resultat.setUnChampCloneable(this.unChampCloneable.clone());
  return resultat;
}
}

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
10 mai 2010 à 10:58
Hello,

Il y a aussi un autre moyen si tu es un grosse feignasse comme moi.

Tu dis juste que ta classe implémente Serializable et ensuite tu utilises
org.apache.commons.lang.SerializationUtils.clone() fournit par apache dans la librairie commons-lang.jar.
Ca clone en profondeur et sans efforts

++ Toinou
0
cs_Taz1984 Messages postés 47 Date d'inscription lundi 20 juillet 2009 Statut Membre Dernière intervention 13 mars 2013
10 mai 2010 à 11:37
Voila ma classe A ;

Supposons que ma classe contient ces 3 attributs.
public class A {
   private int entier ;
   private String chaine ; 
   private UneclasseB  memebreB ;  // une classe

   // constructeur
   public A(){
     entier  = 0 ;
     chaine  = null ; 
     memebreB  = new  UneclasseB  ();
   }
}


Ensuite , j'instancie deux objets de ma classe A ;
objet1 = new A();
objet2 = new A();
objet1 = objet2 ;

A present comment puis je procéder pour qu'il ne pointe pas vers la même zone !!!

Merci d'avance

Comment dois je procéder pour la clonner ??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
10 mai 2010 à 11:48
Salut,

Tu fais un petit mix entre le code de jojolemariole et le mien et tu as ta réponse.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
cs_Taz1984 Messages postés 47 Date d'inscription lundi 20 juillet 2009 Statut Membre Dernière intervention 13 mars 2013
10 mai 2010 à 16:49
Merci j'ai réussi
0
Rejoignez-nous