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 :

[Language]Accès aux variables


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 16
    Points : 11
    Points
    11
    Par défaut [Language]Accès aux variables
    bonjour, je n'ai pas trouvé dans mon bouquin de java comment faire pour que 2 classes pointent vers la meme variable.

    Merci, et je continue de chercher

  2. #2
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 26
    Points : 23
    Points
    23
    Par défaut
    place la variable en static dans une des classes tu pourras y acceder de n' importe ou avec un NomClasse.NomVarible

  3. #3
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    je vois deux solutions, mettre une variable en "public static" ce qui permet a toutes les classes d'y acceder ou donner au contructeur d'une de tes classes la variable de l'autre qui est partagé ! Attention ! le fait de passer par le constructeur a une sementique un peu differente : ce n'est pas ta classe qui peut acceder a la variable mais les instances de cette classe !
    j'espere avoir été assez clair et que cela puisse t'aider
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  4. #4
    Membre éprouvé
    Avatar de c-top
    Profil pro
    Turu
    Inscrit en
    Septembre 2003
    Messages
    972
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Turu

    Informations forums :
    Inscription : Septembre 2003
    Messages : 972
    Points : 1 246
    Points
    1 246
    Par défaut
    Et puis quand deux classes qui pointent vers la même variable il peut y avoir des problèmes de synchronisation...DANGER.

    Imagine deux personnes qui possèdent le même compte en banque (mari et femme par exemple). Un retrait simultanné des deux personnes peut engendrer des erreurs si le cas n'a pas été prévu.

  5. #5
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    Citation Envoyé par c-top
    Imagine deux personnes qui possèdent le même compte en banque (mari et femme par exemple). Un retrait simultanné des deux personnes peut engendrer des erreurs si le cas n'a pas été prévu.
    On s'en fou c'est la banque qui est en tord et elle a qu'a rembourser
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    en ce qui concerne le public static, est ce que je peux ensuite modifier à volonte cette variable au cours du programme ?
    merci

    pour la partie constructeur j'avais pense a qqch comme ca, si tu pouvais developper, ca m'aiderait (je ne vois pas trop ce que tu veux dire par les "instances de cette classe")
    Merci encore

  7. #7
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    Citation Envoyé par Adaemon
    en ce qui concerne le public static, est ce que je peux ensuite modifier à volonte cette variable au cours du programme ?
    oui

    Citation Envoyé par Adaemon
    pour la partie constructeur j'avais pense a qqch comme ca, si tu pouvais developper, ca m'aiderait (je ne vois pas trop ce que tu veux dire par les "instances de cette classe")
    les instances d'une classes sont les objects : par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TaClasse tc = new TaClasse(...);
    dans cet exemple tc est une instance de la classe TaClasse
    Ce que tu peux faire, c'est de passer ta variable partagé par les constructeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class TaClasse {
      private Object varPartagee = null;
      public TaClasse(Object varPartagee) {
        this.varPartagee = varPartagee;
      }
    }
    dans ce cas ton attribut peut etre different pour chaque object de ta classe. ce qui est completement different d'une public static !
    pour s'approcher un peu d'une variable partagée public static tu peux aussi ecrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class TaClasse {
      private static Object varPartagee = null;
      public TaClasse(Object varPartagee) {
        if(TaClasse.varPartagee==null) {
            TaClasse.varPartagee = varPartagee;
        }
      }
    }
    A ce moment, tu auras une variable de classe qui pourra etre partagé avec la classe qui a construit ton object. (enfin a peu de chose pres si tu ecris l'autre classe correctement)

    L'avantage de passer par les constructeur, c'est que ta variable partagé ne sera pas visible de toutes les classes puisqu'elle sera privé !

    Je viens aussi de penser a une autre methode qui serait d'utiliser le mechanisme d'introspection pour acceder a un attribut privé d'une autre classe (cf ce topic qui pourra te donner des indication sur l'introspection : http://www.developpez.net/forums/vie...853842#1853842)

    si tu veux encore plus de renseignement je suis toujours dans le coin
    en esperant t'avoir aidé
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    J'aime beaucoup le :
    le mechanisme d'introspection pour acceder a un attribut privé d'une autre classe
    sinon en fait j'utilisais deja cette technique de constructeurs. Par contre pour les static j'ai des problemes : je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class InitVariables {
    static String path;
    }
     
    class MaClasse {
    MaClasse(){
    System.out.println(path);
    }
     }

  9. #9
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    Par défaut
    [EDIT] bon, le temps que je poste ma reponse, il y a deja eu une autre reponse. Vu le temps et la reflexion que j'ai mis dans le message, je ne l'efface pas[/EDIT]

    Pour repondre a ton interrogation sur "les instances de cette classe"

    Imaginons que tu ais une classe A que tu as defini. Les instances de la classe A sont en fait tous les object qui sont de la classe A.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     A objet1 = new A() ;
    A objet2 = new A() ;
    Dans mon exemple, objet1 et objet2 sont deux instances de ta classe A

    Quand Mobius dit que lorsque tu passes par le constructeur, ceux sont les instances qui ont acces aux champs, cela signifie que si tu passes un objet au constructeur, celui ci peut etre differents pour toutes les instances de la classe. Si tu veux que toutes les instances de ta classe ai acces au meme objet, il faut que tu passes par static. Imaginons que tu veuilles compter le nombre d'instance d'une classe, tu peux fire comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class A{
       public static int _cpt = 0;
     
       public A(){
          _cpt++ ;
       }
     
    }
    Dans ce cas la, toutes les instances de ta classe A partagerons un meme attribut _cpt. Si tu veux passer par le contructeur, il faut faire par exemple comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class A{
       public static B _cpt ;
     
       public A(B c){
         _cpt = c ;
       }
    }
    Dans ce cas la, par exemple toutes tes instances partagerons le meme champs ... Par contre, il faut que tu fasses attention, car comme java utilise des pointeurs cache, ca peut ammener des surprises. Prenons le cas suivant : tu as deux classes A et B qui veulent partager un unique objet pour chacune des instances, donc tu vas les declarer comme static et tu vas passer le constructeurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class A{
         public static C _objPartage ;
         public A( C obj ){
           _objPartage = obj ; }
    }
     
    class B{
         public static C _objPartage ;
         public B( C obj ){
           _objPartage = obj ; }
    }
    Maintenant que tu as tes deux classes, voici comment tu peux te debrouiller pour les faire partager un objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
          C objPartage = new C() ;
          A a = new A(objPartage) ;
          B b = new B(objPartage) ;
    Maintenant tous les instances de A et B partages l'objet C... mais attention, si tu contruis une nouvelle instance de A avec le meme contructeur, tu vas
    "departager" l'objet objPartage entre A et B... donc il faut faire attention.

    Comme tu touches a des attributs static, tu peux aussi faire en sorte de passer par des methodes static pour allouer l'objet C - et perso, je trouve que c'est mieux. Ainsi, pour etre sur de ne pas modifier l'attribut de la classe A sans modifier celui de B, tu peux te debrouiller pour appeler la methode static de B dans celle de A ainsi, si tu modifie l'attribut partage de la classe A, tu le partages directement avec la classe B.

    Apres avoir ecris ce long roman, je viens de me rendre compte que l'on pouvait faire autrement, je n'efface pas tout comme ca tu pourras choisir ta facon de faire.

    L'idee est d'utiliser l'heritage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class abstract Mere{
        protected static O _objPartage ;
     
        public static void setPartage(O objAPartager ){
             _objPartage = objAPartager ;
        }
    }
    class A extends Mere{}
    class B extends Mere{}
    }
    Voila, cette methode semble regler tous les problemes, mais a le desavantage de devoir forcer les deux classes a etre "soeur", i.e. a deriver de la meme classe abstraite... J'ai mis la classe abstraite, c'est juste parce que c'est une classe qui n'a pas le besoin de pouvoir etre instancier directement, car elle est creer uniquement pour faire un lien entre

  10. #10
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class InitVariables {
    public static String path;
    }
     
    class MaClasse {
    MaClasse(){
    System.out.println(InitVariables.path);
    }
     }
    comme ca c'est mieu !
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    merci moebius ^^ je viens de le remarquer alors je me suis vite connecte pour ptet espere enlever le message avant que qqn le voit (ralala boulet un jour, boulet pour toujours ^^)

    euh benratti, laisse moi un peu le temps de lire ton message

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    eh beh que d'idees benratti, pense avoir compris maintenant les instances et comment faire des variables partagees.
    Bon merci à tous alors
    @+ tard je retourne coder

  13. #13
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    Par défaut
    si c'est ok, alors pense au tag resolu dans le titre.

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

Discussions similaires

  1. Acces aux variables d'une DLL
    Par abignon dans le forum MFC
    Réponses: 1
    Dernier message: 08/09/2005, 14h29
  2. [C#] Accès aux variables Session
    Par kalan dans le forum ASP.NET
    Réponses: 9
    Dernier message: 31/08/2005, 16h40
  3. [FLASH MX2004] [AS2] Accès aux variables d'une classe
    Par stailer dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 17/07/2005, 12h58
  4. [Language] Accès à une variable
    Par Boumeur dans le forum Langage
    Réponses: 10
    Dernier message: 10/04/2005, 20h54
  5. [Language]acces aux metode d une classe
    Par harris_macken dans le forum Langage
    Réponses: 5
    Dernier message: 06/04/2005, 09h52

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