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

Java Discussion :

Modifications d'objets complexes


Sujet :

Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Par défaut Modifications d'objets complexes
    Bonjour, ça fait un moment que je cherche une solution à mon problème, donc j'ai décider de le poster sur le forum pour voir si quelqu'un aurai une solution.

    J'ai une classe X qui contient une liste d'objet Y.

    Et plus exactement une arrayList.
    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
     
     
    public class X
    {
    private ArrayList<Y> listeY;
     
     
     
     
    }
     
    public class main{
     
        public static void main(String[] args) {
     
            X x1 = new X();
            x1.listeY.get(0).setAttribut() = 5
     
     
    X x2 = new X(x1) //Car j'ai besoin de modifier les valeur de x1 sans toucher à x1)
     
    x2.listeY.get(0).setAttribut() = 8
     
    }
     
     
     
    }
    Alors les modifications que je fais sur un objet de la listeY sont appliquées dans X1 et dans X2.


    J'ai essayer d'implementer la classe Cloneable, de creer des nouvelles instances chaques fois que je creer un objet copie d'un otre, et d'autres....

    J'ai bien compris c'est du au passage par référence. Mais je ne vois pas comment faire.

    Ce n'est évidemment pas mon code, mais le problème est là.

    Si vous pouviez m'aider svp ?!

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ben si ça modifie des deux coté, c'est que tu as mis la même liste des deux coté. Donc que tu as écrit, en gros

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public X (X autre){
      this.listeY = autre.listeY;
    }
    alors que tu aurais du écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public X (X autre){
      this.listeY = new ArrayList<Y>(autre.listeY);
    }

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Vu ce qu'il nous montre, il semble au contraire qu'il ait bel et bien fait le second code.
    Mais il s'agit d'une shallow copy, alors qu'il lui faudrait plutôt une copie profonde. Il ne faut pas juste créer une nouvelle liste, mais créer une nouvelle liste et une copie de chaque élément de la première liste.

    ... Et il n'y a pas de code idiomatique pour faire une copie profonde. Tout dépend ce qui est prévu pour copier un Y. Si clone() marche, le code serait quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public X (X autre){
      this.listeY = new ArrayList<Y>(autre.listeY.size());
      for(Y y : autre.listeY) {
        this.listeY.add(y.clone());
      }
    }
    Si clone() ne marche pas sur les Y, ben il faut voir ce qui marche, et utiliser ça à la place.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Vu ce qu'il nous montre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x2.listeY.get(0).setAttribut() = 8
    Je dirais surtout que ça compile pas

Discussions similaires

  1. Stockage d'objet complexe
    Par cathar_rhythm dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 18/10/2005, 14h09
  2. Travailler / Créer des objets complexes
    Par Ekinoks dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/08/2005, 14h38
  3. texture sous opengl : objets complexes
    Par pouleriguen dans le forum OpenGL
    Réponses: 1
    Dernier message: 20/11/2004, 19h47
  4. Réponses: 4
    Dernier message: 25/09/2004, 09h58
  5. [HashMap] Modification d'objet d'une Hashtable
    Par viena dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 29/07/2004, 09h04

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