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

Java Discussion :

[Constantes] Quelle solution adopter ?


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 62
    Points : 55
    Points
    55
    Par défaut [Constantes] Quelle solution adopter ?
    J'ai utilisé une méthode que j'ai reprise sur le code d'un ami qui consiste à créer une interface avec la déclaration de toutes ces constantes (quand je dis constantes c'est pour l'exécution en cours mais je devrais peut être parler de paramètres ou d'options) et après il suffit d'implémenter cette interface sur chaque classe pour que celles-ci connaissent ces soi-disantes constantes. Vu que je ne comprends pas vraiment à quoi sert une interface pour le moment, est-ce la meilleure solution où y a-t-il quelque chose plus simple ?

  2. #2
    Membre averti Avatar de piff62
    Inscrit en
    Décembre 2003
    Messages
    431
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2003
    Messages : 431
    Points : 417
    Points
    417
    Par défaut
    Personnelement je prefere les variables static : elles existe sans instanciation de la classe a laquelle elle apartient

    Un exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class Constantes
    {
    public static float pi = 3.14;
    }
    Ainsi, si dans un programme du a besoin de pi
    tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    aire = Constantes.pi * rayon * rayon;
    Un peu comme la classe Math quoi

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    346
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 346
    Points : 439
    Points
    439
    Par défaut
    Pour la définition de constantes on préférera ajouter le mot clé final comme dans l'implémentation des constantes de base :
    http://java.sun.com/j2se/1.5.0/docs/...nt-values.html
    De plus les constantes sont par convention écrites en majuscules, d'où en reprenant l'exemple de piff62 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class Constantes {
      public static final float PI= 3.14;
      ...
    }
    Enfin pour tout comprendre sur les mots-clés : http://java.developpez.com/faq/java/...langage_motcle

  4. #4
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Première chose les constantes sont en majuscules...

    Secundo il y à deux solutions:

    - un fichier .properties dans lequel tu définis toutes tes constantes ou paramètres et que tu charges au démarrage de l'application.

    - une classe dans laquelle tu définis tes données en public final static.

    Moi j'ai opté pour une troisième solution:

    - je crée une interface avec les constantes en public final static, ceci me semble être plus léger qu'une classe (mais ça reste a voir), sinon ça permet à toutes les classes désirant accéder directement à ces constantes d'implénenter cette interface (et plus besoin d'import). Une interface me parait la solution la plus "aboutie" parceque dans une classe utilitaire définissant des constantes tu n'as pas besoin de notion propre à une classe, à savoir la notion de constructeur (c'est une classe qui ne sera jamais instanciée)... mais cela reste mon avis. Et puis finalement ça permet de facilement les différencier sous Eclipse ou tout autre IDE.

    A+

  5. #5
    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
    La technique des interfaces de constantes est selon moi une bonne chose...

    Le seul cas où il faut rester vigilant, c'est lorsque les composants (l'API) du programme devront être exportés vers d'autres programmeurs:

    1) Une fois crée, une interface dois être maintenue dans une API pour toute la durée de vie du projet
    2) une fois implémentée par les classes clientes, une interface pollue l'espace de nommage à l'intérieur de la classe: toutes les variables sont accessibles, qu'on en ait besoin ou non.

    La parade pourrait être d'utiliser une classe de constantes, dont on aurait pris comme précautions d'interdire l'héritage et l'instanciation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // final pour interdire l'héritage
    public final class Constante{
      // constructeur privé pour interdire l'instanciation
      private Constante(){}
     
      public static final int TOTO = 5;
      // ...
     
    }
    au pire, si par la suite on trouve fastidieux de devoir appeler Constante.TOTO à chaque fois (nommage long), on peut simplement déclarer un champ de plus au début de chaque classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class Machin{
      private static final int TOTO = Constante.TOTO;
     
      // ...
    }
    Mais c'est quand même rare d'avoir besoin de tels artifices....
    "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

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    ou ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public interface Constantes {
    	public static final int TOTO = 5;
    }
     
     
     
    public class MyClass implements Constantes {
     
    	....
    	int abc = TOTO;
    	....
    }
    Philippe

  7. #7
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Utiliser une interfaces est une bonne chose effectivement, mais il est tout de même preferable de creer plusieurs interfaces selon la nature des constantes. Car tu peu apprecier de pouvoir "plugger / deppluger" des modules d'une application qui doivent ainsi être independant.

    Mais dans le principe c'est ce qu'il faut faire (même si je ne le fais pas)


    Citation Envoyé par thibaut
    Première chose les constantes sont en majuscules...

    Secundo il y à deux solutions:

    - un fichier .properties dans lequel tu définis toutes tes constantes ou paramètres et que tu charges au démarrage de l'application.

    - une classe dans laquelle tu définis tes données en public final static.

    Moi j'ai opté pour une troisième solution:

    - je crée une interface avec les constantes en public final static, ceci me semble être plus léger qu'une classe (mais ça reste a voir), sinon ça permet à toutes les classes désirant accéder directement à ces constantes d'implénenter cette interface (et plus besoin d'import). Une interface me parait la solution la plus "aboutie" parceque dans une classe utilitaire définissant des constantes tu n'as pas besoin de notion propre à une classe, à savoir la notion de constructeur (c'est une classe qui ne sera jamais instanciée)... mais cela reste mon avis. Et puis finalement ça permet de facilement les différencier sous Eclipse ou tout autre IDE.

    A+
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Pour ma part, je suis un peu dans le meme cas, je cherche une solution pour utiliser des constantes.
    Je pense me tourner vers les interfaces comme vous le dites.
    Cependant j'ai besoin d'initialiser une valeur au démarrage du programme suivant le choix de l'utilisateur.

    En gros :
    quand l'utilisateur démarre le programme, il choisit la langue de traduction.
    J'aimerais que cette variable (String) soit accessible dans toutes mes classes.
    Pour le moment, je suis obligé de la passer dans tous les constructeurs :

    buildGuid(language);
    buildTools(language); etc ...


    Bref il faudrait que j'initialise une constante au début du programme.
    Vous voyez comment faire ?

  9. #9
    Membre expérimenté
    Avatar de viena
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    1 071
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 071
    Points : 1 512
    Points
    1 512
    Par défaut
    Si tu veux pouvoir l'initialiser, tu ne peux pas utiliser le mot clé final.
    A ta place, je mettrais la variable dans les interface avec les autre constantes (qui seront final elles), mais c'est dangereux... donc, je te conseille de la mettre en private et d'utiliser des methodes getters et setters pour l'initialiser et la récuperer... Ca ne supprime pas tous les risques, mais ca les diminue tout de meme...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private static TypeVar maVar;
    public static void setMaVar(TypeVar var) {
       maVar = var;
    }
    public static TypeVar getMaVar() {
       return maVar;
    }
    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java
    "La liberté de tout être s'arréte là où commence celle de l'autre... Respecter l'autre, c'est préserver sa liberté d'être, de penser et de vivre"

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    viena :
    ca ne fonctionne pas :s

    Je peux pas mettre de private dans une interface
    donc je l'ai mis en public :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface Constants {
    	public String LANG="";
    }
    alors pour les methodes setters et getters je dois les mettre dans l'interface ?
    car je ne peux pas déclrarer de body pour les methodes dans une interface.

    et si je fais

    LANG = "test";

    dans mon programme qui implemente Constants, Eclipse me dit que je ne peux pas le faire :

    The final field Constants.LANG cannot be assigned.

    Pourtant j'ai pas mis les mots clés final ni static dans la déclaration de la constante dans l'interface.
    Si je rajoute le mot clé static, j'ai toujours la meme erreur.

  11. #11
    Membre expérimenté
    Avatar de viena
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    1 071
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 071
    Points : 1 512
    Points
    1 512
    Par défaut
    Effectivement, ce que j'ai dit est totalement stupide... on ne peut evidemment pas implementer de methode dans une interface...
    Donc, pas de private et pas de getters et setters.
    De toutes facons, si tu déclare ta variable en public, les getters et setters ne servent plus à rien
    Donc, au choix, tu peux
    - la mettre en public sans final...
    - utiliser une toute autre facon de faire, en ne la considérant pas comme une constante (vu que ça n'en est pas une ) et faire, par exemple, un singleton pour la stocker... mais bon, c'est un peu un bazooka pour ecraser une mouche...
    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java
    "La liberté de tout être s'arréte là où commence celle de l'autre... Respecter l'autre, c'est préserver sa liberté d'être, de penser et de vivre"

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Animageo : désolé de dériver sur ton topic mais je pense que ton problème etait résolu :p
    et comme mon problème est similaire je n'ai pas créé d'autre topic


    Sinon a mon aivs, cest impossible de modifier une variable qui se trouve dans une interface. Je me trompe ?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Viena :


    si je fais l'interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface Constants {
        public String LANG="v";
    }
    et une classe pour tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public Test implements Constants{
     
        public Test() {
             LANG = "test";
        }
     
        (...)
     
    }

    j'ai une erreur sur : LANG="test"
    je peux pas l'affecter


    comment faire avec un "singleton" ?
    EDIT : j'ai trouver quelque doc sur les singleton, ca me parrait lourd pour une seule variable.

    En fait il faudrait une sorte de variable globale à toutes les classes de mon projet.

  14. #14
    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
    le singleton ne te servira à rien dans ton cas... la meilleur solution serait d'utiliser une classe de constantes, dans laquelle tu pourras faire des méthodes privées, des blocs static, etc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    final class Const extends Object{
      private Const(){}
     
      public final static int TOTO = initToto();
     
      private static int initToto(){
        // initialise toto
      }
     
    }
    ça me semble la meilleur solution dans ton cas
    "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

  15. #15
    Membre expérimenté
    Avatar de viena
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    1 071
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 071
    Points : 1 512
    Points
    1 512
    Par défaut
    Vi, je pense que Pill a raison.
    D'ailleurs, rien ne t'empeche de faire une interface avec tes vraies constantes, de l'implementer dans une classe ou tu ajouterais ta variable et d'utiliser cette classe ensuite avec des extends.
    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java
    "La liberté de tout être s'arréte là où commence celle de l'autre... Respecter l'autre, c'est préserver sa liberté d'être, de penser et de vivre"

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    en effet ca fonctionne pas mal
    je dois modifier un peu mon programme quant à l'interface graphique de sélection de la langue mais ca devrait aller

    merci
    (pour ma part c'est résolu)

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par Valerio
    Animageo : désolé de dériver sur ton topic mais je pense que ton problème etait résolu :p
    et comme mon problème est similaire je n'ai pas créé d'autre topic
    Pas de problème, je considère également que le problème est résolu. Merci à tous !

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

Discussions similaires

  1. mysql sécurité : quelle solution adopter
    Par ben.IT dans le forum MySQL
    Réponses: 5
    Dernier message: 09/10/2009, 22h17
  2. WCF <-> Axis2 : types complexes, quelle solution adopter?
    Par mkton dans le forum Windows Communication Foundation
    Réponses: 0
    Dernier message: 24/08/2009, 11h22
  3. Réponses: 4
    Dernier message: 10/06/2006, 10h04
  4. [Intranet] Quelle solution choisir ?
    Par stailer dans le forum Développement
    Réponses: 6
    Dernier message: 06/09/2003, 01h17

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