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 :

Variables Globales


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Points : 57
    Points
    57
    Par défaut Variables Globales
    Salut tout le monde.
    Je voudrais savoir dans quelle mesure je pourrais declarer une classe contenant des attributs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static ArrayList errors = null;
    et l'utiliser comme disons une classe globale. Bien sur je pourrais modifier la valeur de l'attribut au cours de l'exécution du programme, cependant étant donné que plusiseurs utilisateurs vont se connecter à l'application il faudrait que la classe soit globale disons à l'utilisateur connecté. J'aurais une classe du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class JtaxGlobals {
     
    	public static HttpSession session = null;
     
    	public static String button_text = null;
     
    	public static ArrayList errors = null;
     
    }
    que je pourrais utiliser comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JtaxGlobals.button_text="test";
    par exemple

  2. #2
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    On met les variables globales dans une interface non?... En tout cas moi j'ai toujours fait comme ca.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface Constantes{
    public String propriete=valeur;
    }
    Pour chaque langage existe une faq / N'oubliez pas de lire les règles du forum

  3. #3
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Points : 57
    Points
    57
    Par défaut
    Ah bon je ne savais pas. mais dis moi est ce que ça marche et comme tu l'utilise ton interface. Y a t il une classe pour l'implementer ou bien ???

  4. #4
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par pollux007
    On met les variables globales dans une interface non?... En tout cas moi j'ai toujours fait comme ca.
    c'est une mauvaise idée:

    1) dans les interfaces, ce ne sont pas des variables, mais exclusivement des constantes
    2) le fait d'implémenter une interface "pollue" l'espace de nommage à l'intérieur de la classe qui l'implémente (on ne peut plus déclarer de variables portant le même nom)

    Même si on trouve ce procédé dans certaines API du langage (SwingConstants, ...), c'est un défaut de conception qu'il convient de ne pas reproduire.

    Le meilleur moyen de partager des variables entre plusieurs classes, c'est de passer par des champs statiques:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public final class Const {
      public static int i = 5;
    }
     
    class Toto {
      void method(){
        int j = Const.i;
        Const.i = j*2; 
        ...
      }
    }
    mais ça reste moche et très éloigné de l'orienté objets....

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  5. #5
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Points : 57
    Points
    57
    Par défaut
    Tu dis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public final class Const { 
      public static int i = 5; 
    }
    faut il réelement mettre , pour quelle raison ??[/code]

  6. #6
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    J'ai confondu constantes et variables globales
    Pour chaque langage existe une faq / N'oubliez pas de lire les règles du forum

  7. #7
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par sheura
    faut il réelement mettre , pour quelle raison ??
    non, c'est pas obligatoire, mais c'est mieux... le "final" devant une classe interdit d'étendre la classe (on ne peut plus hériter de cette classe)

    dans notre cas, il est inutile d'hériter depuis une classe de variables pseudo-globales: ce serait même assez stupide que quelqu'un le fasse. Donc on l'interdit (programmation défensive)




    EDIT: je rajouterais qu'il est également déconseillé d'instancier les classes de variables globales: pour l'éviter on peut déclarer le constructeur privé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public final class GlobalVar{
      private GlobalVar{}
     
      ...
    }
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  8. #8
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    sheura, je trouve la solution que tu as proposé dans ton premier message très bonne, à un petit point près : il faudrait plutot passer par des getters/setters et déclarer les variables privées.

    Ca te permettrait de filtrer les opérations possibles (par ex. button_text ne peut prendre que des valeurs prédéfinies par des constantes, ou on ne peut pas vider la ArrayList).
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  9. #9
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Points : 57
    Points
    57
    Par défaut
    C'est cool alors je garde ma méthode et je rajoute les getters/setters.
    Merci à tous .

  10. #10
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Une autre méthode serait d'utiliser le design pattern du Singleton qui permet d'être sûr qu'un objet n'est alloué qu'une fois pour toutes...

    L'avantages c'est que tu as un vrai objet, ce qui permet une meilleure évolution que d'utiliser des méthodes et attributs statiques...


    a++

  11. #11
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Points : 57
    Points
    57
    Par défaut
    Je suis d'accord avec toi seulement je veux que cet object soit unique seulement pour l'uilisateur connecté et valide le temps de sa session alors que si je use le singleton je risque d'avoir un object unique pour tous les users.

  12. #12
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sheura
    Je suis d'accord avec toi seulement je veux que cet object soit unique seulement pour l'uilisateur connecté et valide le temps de sa session alors que si je use le singleton je risque d'avoir un object unique pour tous les users.
    Oui en effet je n'avais pas vu ca

    Mais la solution des champs static te pose le même problème : les valeurs seront partagées par tous les utilisateurs !!!

    Quels est ton architecture ? Une simple map avec l'identification de la session de l'utilisateur devrait faire l'affaire...

    a++

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    509
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 509
    Points : 568
    Points
    568
    Par défaut
    tu as une session par utilisateur tu peux donc y stocker toutes les valeurs que tu souhaites et elle seront propres a la sesion et donc a l'utilisateur non ??
    UML avec VIOLET

  14. #14
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    Dans la session ou bien si tu veux un objet à toi tu te fais un BeanSession...
    Pour chaque langage existe une faq / N'oubliez pas de lire les règles du forum

Discussions similaires

  1. Variable globale / Propriété des threads
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 03/10/2003, 10h49
  2. Cacher Variable Url avec Variable Globale
    Par danuz dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/09/2003, 17h20
  3. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 19h22
  4. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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