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

avec Java Discussion :

ArrayList de classe : Tout le monde pareil


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Par défaut ArrayList de classe : Tout le monde pareil
    Bonjour,
    je débute un peu en java et je rencontre un problème qui semble lié à des références mais je n'arrive pas à comprendre pourquoi et je ne trouve pas de solution.

    J'ai refais un morceau de code simplifié qui reprend mon problème :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    import java.util.ArrayList;
     
    class Isp {
      public String serverHostname;
      public String serverAddress;
     
      public Isp() {
        this.serverHostname = null;
        this.serverAddress = null;
      }
    }
     
     
    class IspDb {
      private ArrayList<Isp> ispCatalog;
     
      public IspDb() {
        super();
        this.ispCatalog = new ArrayList<Isp>();
      }
     
      public void go() {
        Isp isp = new Isp();
        isp.serverHostname = "host1.fr";
        isp.serverAddress = "1.1.1.1";
        this.ispCatalog.add(isp);
     
        isp.serverHostname = "host2.fr";
        isp.serverAddress = "2.2.2.2";
        this.ispCatalog.add(isp);
      }
     
      public void affiche() {
        for (Isp i : this.ispCatalog) {
          System.out.println("Host=" + i.serverHostname + " ; Adresse=" + i.serverAddress);
        }
      }
    }
     
    public class Bonjour {
      public static void main(String[] args) {
        IspDb ispdb = new IspDb();
        ispdb.go();
        ispdb.affiche();
      }
    }
    Pour faire simple, la classe IspDb contient une arrayList de la classe Isp. L'objectif est d'avoir une liste d'host et d'adresse.
    La fonction GO instancie un objet ISP, pose une valeur pour chaque variable et fait un ADD dans ispCatalog. Jusque là, cela me semble logique.
    Par contre, lorsque je parcours la liste, tous les éléments sont aux valeurs du dernier add. En debug, je vois bien que l'insertion du second "remplace" le premier.
    Quelqu'un pourrait m'expliquer ce que je fais de travers ?

    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
    Tu le dis toi même; tu crée un ISP, pas deux. C'est le même ISP que tu ajoute deux fois à l'arraylist et que tu modifie à chaque fois. Si tu veux ajouter 2 instance d'ISP distinctes, il te faut deux appels à new ISP.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Tu le dis toi même; tu crée un ISP, pas deux. C'est le même ISP que tu ajoute deux fois à l'arraylist et que tu modifie à chaque fois. Si tu veux ajouter 2 instance d'ISP distinctes, il te faut deux appels à new ISP.
    En effet, cela parait tellement logique en te lisant.
    C'est ok, ça marche nickel
    Merci

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Au passage pour éviter ce genre d'erreur, il serait préférable d'utiliser une classe immuable :
    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
    final class Isp {
      private final String serverHostname;
      private final String serverAddress;
     
      public Isp(String serverHostname, String serverAddress) {
        this.serverHostname = serverHostname;
        this.serverAddress = serverAddress;
      }
     
      public String getServerHostname() {
        return this.serverHostname;
      }
     
      public String getServerAddress() {
        return this.serverAddress;
      }
    }


    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Au passage pour éviter ce genre d'erreur, il serait préférable d'utiliser une classe immuable :
    Merci de l'info. Je fais une session de RTFM sur le final class.

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

Discussions similaires

  1. Déclarer une classe visible de tout le monde
    Par oodini dans le forum C++
    Réponses: 10
    Dernier message: 23/03/2007, 14h24
  2. Les Bases de Données! tout un monde!!
    Par kikimnet dans le forum Bases de données
    Réponses: 3
    Dernier message: 29/04/2004, 18h26

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