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

Collection et Stream Java Discussion :

Références des objets d'un ArrayList


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Points : 479
    Points
    479
    Par défaut Références des objets d'un ArrayList
    Bonjour, pour ne pas perdre de temps, voici un bout de code :
    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
    //Création d'entreprises.
    Entreprise e1 = new Entreprise();
    e1.setNom("Entreprise numéro Une");
    Entreprise e2 = new Entreprise();
    e2.setNom("Entreprise numéro Deux");
    //Ajout des entrprises dans une liste typée.
    List<Entreprise> liste = new ArrayList<Entreprise>();
    liste.add(e1);
    liste.add(e2);
     
    //Création d'une nouvelle liste avec les mêmes valeurs que celle créée précédemment.
    List<Entreprise> nouvelleListe = new ArrayList<Entreprise>(liste);
    //Je modifie le nom de la première entreprise de la liste
    nouvelleListe.get(0).setNom("test");
     
    System.out.println(liste.get(0).getNom());
    System.out.println(nouvelleListe.get(0).getNom());
    Résultat: cela affiche la même chose. Ce qui est normal car les élements de nouvelleListe pointent sur ceux de liste.

    Ma question :
    Mais comment y remédier sachant que je voudrais que seules les valeurs de nouvelleListe soient éditées ?

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 120
    Points : 133
    Points
    133
    Par défaut
    Tu peux cloner un objet via la methode clone. Ta classe doit juste implémenter Cloneable

    Tu devra alors définir la methode clone qui en général fait une new ou appel clone des objets présents dans ta classe

  3. #3
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    Par défaut
    Le fait de seulement implémenter la méthode clone() sur la classe Entreprise ne va pas résoudre ton problème. En effet, le constructeur ArrayList(Collection) copie les références d'une liste dans l'autre, donc pas d'appel à la méthode clone...

    Je ne vois que l'insertion dans la 2è liste à partir du parcours de la 1ère liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    List<Entreprise> nouvelleListe = new ArrayList<Entreprise>();
    for (Iterator<Entreprise> iter = liste.iterator(); iter.hasNext();) {
      nouvelleListe.add(iter.next().clone());
    }
    ou alors créer ta propre implémentation de List dont le constructeur clonera par défaut son contenu interne...

  4. #4
    Membre confirmé Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Points : 479
    Points
    479
    Par défaut
    Merci !
    Il fallait effectivement implémenter Cloneable à ma classe Entreprise et redéfinir la méthode clone().
    Pour le parcours, j'ai créé une nouvelle classe qui se charge de renvoyer une liste avec les valeurs clonées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public List<Entreprise> cloneEntreprise(List<Entreprise> oldList) {
        List<Entreprise> newList = new ArrayList<Entreprise>();
        for(Iterator<Entreprise> iter = oldList.iterator(); iter.hasNext();)
            newList.add((Entreprise) iter.next().clone());
        return newList;
    }

  5. #5
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    Par défaut
    Impec !

    2 petites remarques :

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    newList.add((Entreprise) iter.next().clone());
    Le casting me semble superflu puisque tu as typé ton iterator lors de sa déclaration

    2) Il peut être intéressant de passer ta méthode cloneEntreprise en "static", ainsi tu n'auras pas besoin d'instancier ta nouvelle classe à chaque fois que tu veux utiliser cette méthode

  6. #6
    Membre confirmé Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Points : 479
    Points
    479
    Par défaut
    Citation Envoyé par DevTeam_ Voir le message
    Le casting me semble superflu puisque tu as typé ton iterator lors de sa déclaration
    Pourtant, si je ne caste pas, Eclipse me renvoie une erreur :
    The method add(Entreprise) in the type List<Entreprise> is not applicable for the arguments (Object).

  7. #7
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    Par défaut
    Citation Envoyé par desert Voir le message
    Pourtant, si je ne caste pas, Eclipse me renvoie une erreur :
    The method add(Entreprise) in the type List<Entreprise> is not applicable for the arguments (Object).
    Ta méthode clone renvoie bien un objet de type Entreprise ???

  8. #8
    Membre confirmé Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Points : 479
    Points
    479
    Par défaut
    Non, elle renvoie un Object...
    En fait, je l'utilise aussi dans une autre méthode qui se charge de renvoyer une liste d'objets dérivés de la classe Entreprise.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Référence des objets
    Par speed_man002 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 30/11/2009, 17h39
  2. préciser le type des objets dans une classe dérivée d'arraylist
    Par JCD21 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 28/06/2008, 18h04
  3. Serialisation/deserialisation d'un arrayList retourne des objets vides
    Par cdtkoenig dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 18/07/2007, 15h45
  4. Réponses: 1
    Dernier message: 06/04/2007, 17h59

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