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 :

Comment modifier les champs d'une classe depuis une autre


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet sur HPC
    Inscrit en
    Août 2003
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet sur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 27
    Points : 19
    Points
    19
    Par défaut Comment modifier les champs d'une classe depuis une autre
    Bonjour à tous,

    Voilà, je me pose une question peut être toute bête mais je bloque, et ce après plusieurs recherches.

    J'ai une classe constituées de données, appelons la ModeleDonnees, qui comprends plusieurs attributs. J'ai plusieurs sous classes (ParseurX, ParseurY, etc...) qui devront mettre à jour ces données.

    Sachant que mes classes ParseursX, Y, Z sont instanciées dans une classe Traitement, comment je peux simplement modifier les attributs de ma classe ModeleDonnees ?
    Je voudrais développer une solution générique, donc idéalement que chaque classe retourne un objet de type ModeleDonnees mais je vois pas comment faire ce genre de chose. Je pense que j'ai loupé un truc sur la communication entre objets

    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
     
    Classe Traitement {
     
        void traiterLigne {
            ModeleDonnees donnes = new ModeleDonnees();
            ParseurX ligneX = new ParseurX();
            ligneX.parserLigneX(ligne);
            ??? comment alimenter ModeleDonnees depuis ma méthode parserLigneX ???
        }
     
    }
     
     
    Classe ParseurX {
     
         ModeledeDonnees parserLigneX {
     
     
         }
     
    }

    Merci !

  2. #2
    Membre expert
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Points : 3 654
    Points
    3 654
    Billets dans le blog
    20
    Par défaut
    Tu à en effet loupé un truc. La visibilité.
    Tu n'as pas accès à tes donnée de ta classe car ils sont en privé (private). Pour avoir accès à ses données on créer donc des getter et setter. Des fonction publique qui permette de modifier ou d'avoir accès au attribut.
    Si tu as un attribut name tu aura par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private String name;
     
    public String getName(){
    return name;
    }
     
    public void setName(String name){
    this.name = name;
    }
    en général comment accéder ou travailler avec les attribut d'un objet ? En créant des fonction à l'objet qui font le travail.
    il à d'autre moyen de rendre visible les attributs comme en les mettant en public (accessible à tous), ou en protected (accessible au classe du même package ou classe hérité)
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ParseurX ligneX = new ParseurX(modelDonnees);
    par exemple.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Chef de projet sur HPC
    Inscrit en
    Août 2003
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet sur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par MarieKisSlaJoue Voir le message
    Tu à en effet loupé un truc. La visibilité.
    Tu n'as pas accès à tes donnée de ta classe car ils sont en privé (private). Pour avoir accès à ses données on créer donc des getter et setter. Des fonction publique qui permette de modifier ou d'avoir accès au attribut.
    Si tu as un attribut name tu aura par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private String name;
     
    public String getName(){
    return name;
    }
     
    public void setName(String name){
    this.name = name;
    }
    en général comment accéder ou travailler avec les attribut d'un objet ? En créant des fonction à l'objet qui font le travail.
    il à d'autre moyen de rendre visible les attributs comme en les mettant en public (accessible à tous), ou en protected (accessible au classe du même package ou classe hérité)
    Merci, la visibilité et getter/setter j'ai bien compris. Mais le truc c'est que je voulais eviter d'avoir une instanciation d'un parseur, récupérer les valeurs retournées et setter des attributs de ModeleDonnees.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Chef de projet sur HPC
    Inscrit en
    Août 2003
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet sur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    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
     
    Classe Traitement {
     
        void traiterLigne {
            ModeleDonnees data = new ModeleDonnees();
            ParseurX ligneX = new ParseurX(data);
        }
     
    }
     
     
    Classe ParseurX {
     
         void parserLigneX(ModeleDonnees data) {
    		....
                    data.setTruc(valeur);  <= ça marche ça ?
         }
     
    }
    Merci tchize_, je cherchais à faire ce stype de passage de paramétre. Donc si je résume :
    - je passe en paramètre un objet instancié de la classe ModeleDonnees
    - dans ma méthode parserLigneX, je sette mes attributs : mais c'est là que je ne comprends pas, est-ce data va être modifié ou je dois déclarer ma méthode de type ModeeDonnes et non void ? C'est ce retour de valeur que je ne comprends pas.

    En fait, ma confusion vient de là : lors d’un appel de méthode en java, les paramètres de type primitif sont passés par valeur, et ceux de type objet sont passés par référence.

    Merci.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par SuperJoker Voir le message
    En fait, ma confusion vient de là : lors d’un appel de méthode en java, les paramètres de type primitif sont passés par valeur, et ceux de type objet sont passés par référence.
    Les objets sont passés par valeur, et cette valeur est une référence. Tout comme les types primitifs sont passés par valeur, et cette valeur est un nombre, un caractère ou un booléen.

    Prenons des exemples. Si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void parser(Modele modele) {
      modele = new Modele();
      modele.machin = 8;
    }
     
    void tester() {
      Modele modele = new Modele();
      parser(modele);
      System.out.println(modele.machin);
    }
    Ça fait la même chose que si tu avais fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void parser(int i) {
      i = 8;
    }
     
    void tester() {
      int i = 3;
      parser(i);
      System.out.println(i);
    }
    La même chose : rien.
    La méthode appelante décide de ne plus travailler sur le paramètre qu'on lui a passé, mais d'assigner un autre objet à ce paramètre à la place. Ce qui ne concerne qu'elle et n'a pas d'effet sur l'objet qui lui avait été fourni.

    Par contre si tu modifies l'objet lui-même au lieu d'assigner un autre objet au paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void parser(Modele modele) {
      // pas de new : on travaille sur l'objet qui nous a été donné, pas un autre
      modele.machin = 8;
    }
     
    void tester() {
      Modele modele = new Modele();
      parser(modele);
      System.out.println(modele.machin);
    }
    Le fait de modifier cet objet est visible pour tout ce qui connaît cet objet : l'appelant, et tout ce qui en garde l'instance quelque part.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre à l'essai
    Homme Profil pro
    Chef de projet sur HPC
    Inscrit en
    Août 2003
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet sur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Alors là, un grand merci pour tes exemples simples et efficaces : j'ai tout compris

    Ton exemple aurait sa place dans les FAQ java amha.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par SuperJoker Voir le message

    En fait, ma confusion vient de là : lors d’un appel de méthode en java, les paramètres de type primitif sont passés par valeur, et ceux de type objet sont passés par référence.

    Merci.
    Alors on va faire couic directement aux idées reçues, ce sera plus simple. Java traite tous les paramètres d'une méthode de la même manière: tous les paramètres de méthodes et constructeurs, en java, sont passé par copie
    Une variable de type primitif stocke la valeur
    Une variable de type objet stocke une référence
    Une référence pointe vers une instance d'un objet.

    Tout le reste découle de ça.

    Donc quand tu "passe un objet" à un méthode, tu passe une copie de la référence vers la même instance. Si dans la méthode en question tu appelle d'autres méthodes sur la référence ou tu affecte l'état de l"objet pointé par la variable, tu affecte le même objet que l'appelant. Si tu stocke une nouvelle valeur dans la référence, ça n'affecte que la méthode et les modifications d'état de ce nouvel objet ne sont pas transféré vers l'objet précédent.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    List<String> maListe = .....;
    maMethode(maListe);
    //....
     
    public void maMethode(List<String> x){
         x.add("Bonjour");   // affecte le contenu de l'objet pointé par x et maListe
         List<String> y = x;
         y.add("Et bonne chance"); // affecte le contenu de l'objet pointé par  x, y et maListe
         x = new ArrayList<String>(); // affecte x, pas l'objet pointé par x, on change d'objet pointé
         x.add("Au Revoir"); // affecte uniquement le nouvel objet pointé par x
         y.add("Ciao"); // affecte le contenu de l'objet pointé par  y et maListe
    } // maListe et y pointent vers le même objet qui contient maintenant [Bonjour, Et bonne chance, Cia], x pointe vers un objet qui contient [Au Revoir]

  9. #9
    Membre à l'essai
    Homme Profil pro
    Chef de projet sur HPC
    Inscrit en
    Août 2003
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet sur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Alors on va faire couic directement aux idées reçues, ce sera plus simple. Java traite tous les paramètres d'une méthode de la même manière: tous les paramètres de méthodes et constructeurs, en java, sont passé par copie
    Une variable de type primitif stocke la valeur
    Une variable de type objet stocke une référence
    Une référence pointe vers une instance d'un objet.

    Tout le reste découle de ça.

    Donc quand tu "passe un objet" à un méthode, tu passe une copie de la référence vers la même instance. Si dans la méthode en question tu appelle d'autres méthodes sur la référence ou tu affecte l'état de l"objet pointé par la variable, tu affecte le même objet que l'appelant. Si tu stocke une nouvelle valeur dans la référence, ça n'affecte que la méthode et les modifications d'état de ce nouvel objet ne sont pas transféré vers l'objet précédent.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    List<String> maListe = .....;
    maMethode(maListe);
    //....
     
    public void maMethode(List<String> x){
         x.add("Bonjour");   // affecte le contenu de l'objet pointé par x et maListe
         List<String> y = x;
         y.add("Et bonne chance"); // affecte le contenu de l'objet pointé par  x, y et maListe
         x = new ArrayList<String>(); // affecte x, pas l'objet pointé par x, on change d'objet pointé
         x.add("Au Revoir"); // affecte uniquement le nouvel objet pointé par x
         y.add("Ciao"); // affecte le contenu de l'objet pointé par  y et maListe
    } // maListe et y pointent vers le même objet qui contient maintenant [Bonjour, Et bonne chance, Cia], x pointe vers un objet qui contient [Au Revoir]
    Merci pour ce nouvel exemple, notamment la lligne List<String> y = x; qui montre bien la communication entre objets.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    il n'y a pas de communication entre objet. y et x dans cette ligne pointent vers le même objet.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/07/2011, 11h51
  2. Modifier une variable d'une classe depuis une autre classe
    Par Kezado dans le forum Général Java
    Réponses: 8
    Dernier message: 23/09/2010, 14h52
  3. Eval d'une propriété d'une classe dans une classe
    Par bizet dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/10/2008, 09h43
  4. Réponses: 2
    Dernier message: 26/11/2007, 12h22

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