Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2483 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [Java] stocker les constantes dans un singleton ou non ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Java] stocker les constantes dans un singleton ou non ?

n°323257
JeFFreYY
Posté le 05-03-2003 à 10:45:16  profilanswer
 

Je voudrais savoir, d'après toutes vos expériences, qu'est-ce qui vous semble le plus adapté, le moins couteux en ressources, ... pour stocker les constantes. Le singleton ou bien stocker toute les constantes sous la forme "static" ?
Merci bieng :)


Message édité par JeFFreYY le 05-03-2003 à 10:46:16
mood
Publicité
Posté le 05-03-2003 à 10:45:16  profilanswer
 

n°323273
darklord
You're welcome
Posté le 05-03-2003 à 10:54:46  profilanswer
 

bin une constantes ca devrait etre statique il me semble. Dans Apache SOAP il y a un exemple de ce genre d'objet, voir l'objet Constants
 
A+


---------------
Just because you feel good does not make you right
n°323280
benou
Posté le 05-03-2003 à 10:56:36  profilanswer
 

en performance : un bête static final int
 
mais je trouve nettement mieux d'utiliser des singletons...
ca a des tats de trucs pratique, genre la méthode toString, le fait de pouvior les utiliser en tant que clef dans une hashmap, etc ... et puis c'est plus objet :o

n°323369
JeFFreYY
Posté le 05-03-2003 à 12:19:13  profilanswer
 

Ok merci , en plus g eu droit aux 2 big boss de Java :)
 

n°323535
gfive
Posté le 05-03-2003 à 14:58:49  profilanswer
 

.....Ben, tes constantes, Benou, pkoi tu les met pas en (par exemple)  
 
static final Integer MAX=new Integer(3);
et
static final int MAX_VALUE = 3;
 
par exemple....Non?? enfin, je trouve ça plus "léger" que des singletons...Et tiens, une question comme ça, pour Benou, t'as un exemple d'un de tes singletons, pour voir?? Parce que comme ça m'est jamais venu à l'idée de faire comme ça (enfin, je crois, ou alors j'ai mal compris) et que ça peu être utile, ben ça m'intéresse!  
 
Et sinon, ce que je fais des fois, quand j'ai beaucoup de classes qui doivent accéder à mes constantes, et qu'il n'y a pas d'ambiguité sur leur signification (genre, au hasard, des ID de types de messages, pour un protocole) j'ai fait une interface ProtocolConstants, qui contient mes constantes.  
Quand j'ai besoin d'une constante dans une classe, je lui fait implémenter mon interface, et hop, j'accède directement à mes constantes...
 
Bon, je sais pas ce que vous aller en penser (mais ça m'intéresse, tiens, d'ailleurs, pour voir si je met complètement le nez dedans ou pas) mais c'est assez pratique.

n°323599
_guigui_
Posté le 05-03-2003 à 16:00:54  profilanswer
 

je ne suis pas sur que d'un point de vue maintenabilité ca soit terrible terrible...
c'est quand même plus clair d'avoir une classe Constants et d'utiliser Constants.CONSTANTE que d'utiliser CONSTANT et de ne pas trop savoir d'où ca sort...
et niveau perf ca doit être moins bon non? :??: faudrait tester pour voir, la taille en mémoire de l'objet doit être plus importante quand tu implémentes ton interface de constantes non?

n°323604
JeFFreYY
Posté le 05-03-2003 à 16:04:49  profilanswer
 

En tout cas, il y a quand même un désavantage à utiliser des constantes sous formes "static final", c'est que je serai obligé de recompiler toutes les classes qui utilisent ces constantes si un jour je change leur valeur...  

n°323662
benou
Posté le 05-03-2003 à 16:53:02  profilanswer
 

JeFFreYY a écrit :

En tout cas, il y a quand même un désavantage à utiliser des constantes sous formes "static final", c'est que je serai obligé de recompiler toutes les classes qui utilisent ces constantes si un jour je change leur valeur...  


dans tous les cas, c'est des static final que tu vas devoir utiliser hein ! :/

n°323668
JeFFreYY
Posté le 05-03-2003 à 16:57:25  profilanswer
 

Bah d'après ce que j'ai pu voir, si je crée un singleton avec les constantes non static, je ne dois pas tout recompiler vu kil y a un appel de mon objet singleton chaque fois que je demande une constante en runtime;
 par contre si je les met en "static final", les constantes seront remplacées à la compilation, il n'y a plus d'appel lors du run...

n°323675
benou
Posté le 05-03-2003 à 16:59:15  profilanswer
 


je voulais dire, un truc comme ca :  
 
ici par exemple, c'est des constantes sous forme de singleton avec une notion d'ordre!

Code :
  1. public class AlertLevel implements Comparable {
  2.    public static final AlertLevel INFO = new AlertLevel(0, "INFO" );
  3.    public static final AlertLevel WARNING = new AlertLevel(1, "WARNING" );
  4.    public static final AlertLevel ERROR = new AlertLevel(2, "ERROR" );
  5.    public static final AlertLevel FAILURE = new AlertLevel(3, "FAILURE" );
  6.    private int m_intLevel;
  7.    private String m_name;
  8.    private AlertLevel(int intLevel, String name) {
  9.       this.m_intLevel = intLevel;
  10.       this.m_name = name;
  11.    }
  12.    public String toString() {
  13.       return m_name;     
  14.    }
  15.    public int compareTo(Object o) {
  16.       return this.m_intLevel - ((AlertLevel) o).m_intLevel;
  17.    }
  18. }


 
L'avantage c'est que si demain tu veux ajouter des fonctionnalitées à cette constante, c'est facile alors que si tu l'a définit en tant que int, tu devra faire une classe avec plein de méthode static utilitaire ce qui pas cool.
 
Autre intérêt, comme je le disais, c'est que tu peux l'utiliser directement avec les classes utilisant l'algo de hashage (HashMap, HashSet, etc ...).

mood
Publicité
Posté le 05-03-2003 à 16:59:15  profilanswer
 

n°323697
darklord
You're welcome
Posté le 05-03-2003 à 17:09:17  profilanswer
 

ouais et ca ca arrache, je l'ai utilisé pour pas mal de truc au taf et ca rend le code assez lisible finalement :o


---------------
Just because you feel good does not make you right
n°323729
gfive
Posté le 05-03-2003 à 17:56:25  profilanswer
 

Ah ouais, je vois!! :)  
Ouais, c'est pas mal, effectivement, comme truc!!
 
Mais bon, faut dire aussi que ce que je pose comme constantes, ce sont à 99% des trucs qui ne sont pas destinés à changer : le timeout par défaut d'une socket ou d'une connection DB, le port par défaut d'un service (genre 21 pour ftp)...
Même pour les Ids de messages de mon protocole, en fait, j'ai des constantes, mais que je n'utilise qu'en "cas d'urgence" : en fait, la correspondance ID/Classe est en conf (base ou fichier) et les constantes ne sont utilisées que si la conf ne peut pas être lue, non sans avoir loggé un affreux truc pas cool dans le log d'erreur!! :D
 
Mais bon, sinon, c'est vrai que des static final, en dehors de cas du style DEFAULT_FTP_PORT=21, j'en utilise pas....Je fais des singletons, effectivement, mais il m'était jamais venu à l'esprit qu'en fait, je faisait des constantes avec sans le savoir...
 
Je suis le Monsieur Jourdain de la constante dans un singleton, c'est bô!

n°324022
benou
Posté le 05-03-2003 à 22:07:13  profilanswer
 

en fait mon truc, c'est plus pour faire des énumérations ...

n°324046
the real m​oins moins
Posté le 05-03-2003 à 22:27:37  profilanswer
 

euh ouais
arretez moi si je dis une connerie mais un
public static final String pouet = new String("pouet" );
dans une classe quelconque...
c'est un singleton en fait nan :heink:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°324056
benou
Posté le 05-03-2003 à 22:39:11  profilanswer
 

the real moins moins a écrit :

euh ouais
arretez moi si je dis une connerie mais un
public static final String pouet = new String("pouet" );
dans une classe quelconque...
c'est un singleton en fait nan :heink:


 
ben non puisque pouet.equals("pouet" )
 
un singleton ne doit être égale qu'à lui même ...
 

n°324064
the real m​oins moins
Posté le 05-03-2003 à 22:41:27  profilanswer
 

benou a écrit :


 
ben non puisque pouet.equals("pouet" )
 
un singleton ne doit être égale qu'à lui même ...
 
 

ha ouais.
mais bon :o
dans le cas ou la constante dont on a besoin n'est qu'un String ou un int ou autre.... ok, c pas un *vrai* singleton, mais on s'en tape nan? ;)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°324142
phenixl
Posté le 05-03-2003 à 23:51:40  profilanswer
 

the real moins moins a écrit :

ha ouais.
mais bon :o
dans le cas ou la constante dont on a besoin n'est qu'un String ou un int ou autre.... ok, c pas un *vrai* singleton, mais on s'en tape nan? ;)


 
Le singleton pattern est utilise lorsqu'on veut avoir une seule *instance* d'un objet, pas forcement une seule *valeur*. L'exemple qu'a donne benou n'est pas un singleton car on a plusieurs instances de la classe AlertLevel.
 
Un squelette d'implem de singleton pattern donnerait :
 

Code :
  1. public class MonSingleton {
  2.   // instance de MonSingleton est statique (pas forcement finale)
  3.   private static MonSingleton singleton = null;
  4.   // constructeur prive
  5.   private MonSingleton() {}
  6.   // getter permettant de recuperer l instance existante et, si elle n'existe pas, la creant
  7.   public static getSingleton() {
  8.     if (singleton == null) {
  9.       singleton = newMonSingleton();
  10.     }
  11.     // on retourne l'instance unique si elle existe
  12.     return singleton;
  13.   }
  14. }


 
Le singleton pattern n'est absolument pas pense pour l'implementation de constantes, mais pour assurer qu'une seule instance va exister.
 
Par contre passer par des objets par rapport a des types primitifs presente l'avantage de permettre d'utiliser toute la puissance de la POO.
 
A+
 

n°324149
the real m​oins moins
Posté le 05-03-2003 à 23:55:12  profilanswer
 

euh je pense que benou et moi savions tous les deux ce qu'est un singleton ;)
perso j'avais pas maté le code de benou en détails, et pour mon histoire de String static je me suis un peu pissé dessus, mais en meme temps, il n'y a qu'une instance de cette String là. Mais forcément, la methode equals de String etant ce qu'elle est... [:spamafote]
 
bref :jap: de toutes façons, ne fut-ce que pour la bonne synthese ;)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°324150
the real m​oins moins
Posté le 05-03-2003 à 23:56:00  profilanswer
 

ps: en general la methode statique on l'appelle getInstance()
en tous cas moi je prefere :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°324152
darklord
You're welcome
Posté le 05-03-2003 à 23:56:43  profilanswer
 

the real moins moins a écrit :

ps: en general la methode statique on l'appelle getInstance()
en tous cas moi je prefere :o


 
+1


---------------
Just because you feel good does not make you right
n°324214
El_gringo
Posté le 06-03-2003 à 08:48:39  profilanswer
 

benou a écrit :


 
ben non puisque pouet.equals("pouet" )
 
un singleton ne doit être égale qu'à lui même ...
 
 


 
Ben oui, mais en l'occurence, pouet est la même instance que "pouet", grâce au système de mise en cache des chaines de caractères, non !? Dans ce cas particulier, c donc bien un singleton. :D

n°324219
phenixl
Posté le 06-03-2003 à 08:51:55  profilanswer
 

the real moins moins a écrit :

ps: en general la methode statique on l'appelle getInstance()
en tous cas moi je prefere :o


 
Edit : je ne suis toujours pas reveille donc j'efface les conneries que j'ecris...
 
Tout a fait, il etait tard, je venais de rentrer d'un voyage pour le boulot, j'ai presque pas dormi, depuis 1 semaine c'est la folie, demain je repars pour une conf d'une semaine en floride, j'ai un kick off de projet aujourd'hui, bref :
 
"j'ma sui tronpe"
 
:hello:


Message édité par phenixl le 06-03-2003 à 08:54:08
n°324246
benou
Posté le 06-03-2003 à 09:13:20  profilanswer
 

El_gringo a écrit :


 
Ben oui, mais en l'occurence, pouet est la même instance que "pouet", grâce au système de mise en cache des chaines de caractères, non !? Dans ce cas particulier, c donc bien un singleton. :D


non puisqu'il a fait appel explicitement au constructeur de String. Le constructeur construit forcément unn nouvel objet =>
 
pouet != "pouet"
mais pouet.equals("pouet" )
 
[:dtc] ;)

n°324284
El_gringo
Posté le 06-03-2003 à 09:52:24  profilanswer
 

benou a écrit :


non puisqu'il a fait appel explicitement au constructeur de String. Le constructeur construit forcément unn nouvel objet =>
 
pouet != "pouet"
mais pouet.equals("pouet" )
 
[:dtc] ;)


 
Mouais... et, donc, selon toi, quand j'écris, dans une classe "MaClasse" :
public static final MON_POUET = "pouet";
Si, n'importe où ailleurs, j'utilise une chaine de caractère "pouet", cette chaine ne sera pas la même instance que MON_POUET ? Pourquoi MON_POUET ne serait pas bufferisé ?
Par exemple pour faire :
assert (MaClasse.MON_POUET.equals ("pouet" ));
l'assertion est bonne là, non ?
 
EDIT : autant pour moi, ce que je dis là doit être vrai, mais n'est pas en contradiction avec ce que tu dis juste au dessus, j'avais mal lu :D. Appelle explicite au constructeur, bien sur. Tu t'en tires bien ! :D (j't'aurais un jour !)


Message édité par El_gringo le 06-03-2003 à 09:54:04
n°324300
benou
Posté le 06-03-2003 à 10:07:40  profilanswer
 

El_gringo a écrit :


Tu t'en tires bien ! :D (j't'aurais un jour !)


quand tu veux gringo ! http://images.google.fr/images?q=tbn:www.bylancehenriksen.com/last-cowboy-portrait.jpg
 
 :D
 
edit : merde, marche pas le lien [:ruisseau de larmes]


Message édité par benou le 06-03-2003 à 10:12:16
n°324304
phenixl
Posté le 06-03-2003 à 10:14:39  profilanswer
 

benou a écrit :


quand tu veux gringo ! http://images.google.fr/images?q=tbn:www.bylancehenriksen.com/last-cowboy-portrait.jpg
 
 :D
 
edit : merde, marche pas le lien [:ruisseau de larmes]


 
http://www.bylancehenriksen.com/last-cowboy-portrait.jpg
 
 
?

n°324350
El_gringo
Posté le 06-03-2003 à 10:40:28  profilanswer
 
n°324397
benou
Posté le 06-03-2003 à 11:19:25  profilanswer
 


c'est ca le problème, l'image existe plus : y a plsu que google qui la connait mais le tag img ne reconnait pas l'url :'(
http://images.google.fr/images?q=t [...] rtrait.jpg

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [Java] stocker les constantes dans un singleton ou non ?

 

Sujets relatifs
[JAVA] classe Date deprecated ? c grave ?Login & password en JAVA sur une page web
Integration JAVA/JAVASCRIPTest ce que quelqu un a un client SNMP en java ?
probleme de reconnaissance du javaProgramme en java
[java]peut on faire un bip??[Java][RMI] RMISecurityManager
[ java ] ouvrir une page webDessiner un graphique ss applet Java et ss php
Plus de sujets relatifs à : [Java] stocker les constantes dans un singleton ou non ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR