IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Identité des objets apres clonage


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 15
    Points
    15
    Par défaut Identité des objets apres clonage
    tout le monde,
    J'ai besoin d'une petite information svp. J'ai déjà parcouru le net pour voir mais c'est pour être sure que c'est bien cela. Et là j'espère que je poste au bon endroit.
    En fait quand je fais un clonage(profond) sur un objet, l'objet retourné est égal à mon objet cloné. Mais est-ce que les modifications faites sur l'objet intitial se répercutent sur l'objet cloné et inversement?

    Plus simple :
    tmp = g.cloneAsG();

    En les affichant, j'ai :
    tmp : {g1, 5, 2, [(0)(2)(9)(1)(2)(1)(2)], [1 6 ]}
    g : {g1, 5, 2, [(0)(2)(9)(1)(2)(1)(2)], [1 6 ]}

    ok !

    Par contre en faisant une modification sur g, je vois qu'elle se répercute sur tmp :
    g.remove(2);

    tmp après : {g1, 5, 2, [(0)(2)(1)(2)(1)(2)], [1 6 ]}
    g après : {g1, 5, 2, [(0)(2)(1)(2)(1)(2)], [1 6 ]}

    Est-ce que c'est normal ça ?
    J'espère avoir été explicite comme il le faut. En attendant votre aide, d'avance .

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    Les deux objets sont deux instances différentes (tmp != g) mais leurs attributs peuvent pointer sur des objets identiques.
    Tu dis que tu fais un clonage profond mais manifestement la collection (ou le tableau?) [(0)(2)(9)(1)(2)(1)(2)] est partagée par les deux instances, donc quand l'un modifie cette collection, l'autre aussi est affecté.
    Si tu veux faire un vrai clonage profond, il faut aussi cloner les attributs (et ainsi de suite ...)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    T'as raison. Je viens de me rendre compte qu'il y a un attribut que j'avais pas cloné. Là, je viens de le faire, et il me met une exception : java.lang.StackOverflowError ...

    il sa'git d'un sommet qui est constitué de deux arraylist de sommet :

    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
     
    public class Sommet implements Cloneable{
    ...
    private ArrayList<Sommet> successeurs ;
    private ArrayList<Sommet> predecesseurs ;
    ...
     
    public Object clone(){
    try{
    	Sommet copie = (Sommet)super.clone();
     
    	for(int i =0;i< predecesseurs.size();i++)
    		copie.predecesseurs.set(i, predecesseurs.get(i).cloneAsSommet());
     
    	for(int i =0;i< successeurs.size();i++)
    		copie.predecesseurs.set(i, successeurs.get(i).cloneAsSommet());
     
    			return copie;
    		}catch(CloneNotSupportedException e){return null;}
    	}
     
    public Sommet cloneAsSommet(){
    	return (Sommet)clone();
    }
    }
    j'ai ca et dans le graphe qui est constitué de sommets, je fais :

    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
     
    public Object clone() {
    try{
    	Graphe copie = (Graphe)super.clone();
     
    	for(int i = 0;i<copie.operations.size();i++)
    		copie.operations.set(i, operations.get(i).cloneAsOperation());
     
    	for(int i = 0;i<copie.sommets.size();i++)
    		copie.sommets.set(i, sommets.get(i).cloneAsSommet());
     
    	return copie ;
    	}catch(CloneNotSupportedException e){ return null;}
     
    	}
     
    public Graphe cloneAsGraphe(){
    	return (Graphe)clone();
    	}
    Et à l'exécution il me fait une tonne de lignes d'exception java.lang.StackOverflowError. Je crois que c'est parce qu'il tourne infiniement sur les tableau de sommet, mais je vois pas trop comment le contourner

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    Tu peux simplement cloner les listes sans cloer leur contenu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public Object clone(){
    try{
    	Sommet copie = (Sommet)super.clone();
    	copie.predecesseurs = new ArrayList<Sommet>(predecesseurs);
    	copie.successeurs = new ArrayList<Sommet>(successeurs);
     
    	return copie;
    }catch(CloneNotSupportedException e){return null;}
    }

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    J'ai déjà fait ça, (sauf que ça, c'est pour créer d'autres tables avec les mêmes objets) et même probleme Là, je viens de faire le clonage juste sur les arraylist comme tu le disais et ca a l'air de marcher :
    dans le sommet :
    copie.predecesseurs = (ArrayList<Sommet>)predecesseurs.clone() ;
    copie.successeurs = (ArrayList<Sommet>)successeurs.clone() ;

    et dans le graphe :
    copie.sommets = (ArrayList<Sommet>)sommets.clone() ;

    Je continue en espérant que ca marche vraiment !!!

    Merci !!!

Discussions similaires

  1. [le saviez vous ?] existence des objets après un remove
    Par SpaceFrog dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 31/07/2009, 09h55
  2. Sessions avant ou après déclaration des objets PHP
    Par tchoukapi dans le forum Langage
    Réponses: 2
    Dernier message: 22/08/2008, 23h38
  3. Trier une liste d'objets d'après un champ des objets
    Par gids01 dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 02/07/2007, 09h52
  4. Créer des objets sur la pile ?
    Par Cornell dans le forum Langage
    Réponses: 8
    Dernier message: 03/03/2003, 11h47
  5. Importer des objets de 3dsMax
    Par Anonymous dans le forum OpenGL
    Réponses: 3
    Dernier message: 06/05/2002, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo