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

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

Marsh Posté le 05-03-2003 à 10:45:16    

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
Reply

Marsh Posté le 05-03-2003 à 10:45:16   

Reply

Marsh Posté le 05-03-2003 à 10:54:46    

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
Reply

Marsh Posté le 05-03-2003 à 10:56:36    

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

Reply

Marsh Posté le 05-03-2003 à 12:19:13    

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

Reply

Marsh Posté le 05-03-2003 à 14:58:49    

.....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.

Reply

Marsh Posté le 05-03-2003 à 16:00:54    

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?

Reply

Marsh Posté le 05-03-2003 à 16:04:49    

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...  

Reply

Marsh Posté le 05-03-2003 à 16:53:02    

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 ! :/

Reply

Marsh Posté le 05-03-2003 à 16:57:25    

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...

Reply

Marsh Posté le 05-03-2003 à 16:59:15    


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 ...).

Reply

Marsh Posté le 05-03-2003 à 16:59:15   

Reply

Marsh Posté le 05-03-2003 à 17:09:17    

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
Reply

Marsh Posté le 05-03-2003 à 17:56:25    

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ô!

Reply

Marsh Posté le 05-03-2003 à 22:07:13    

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

Reply

Marsh Posté le 05-03-2003 à 22:27:37    

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 ?
Reply

Marsh Posté le 05-03-2003 à 22:39:11    

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 ...
 

Reply

Marsh Posté le 05-03-2003 à 22:41:27    

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 ?
Reply

Marsh Posté le 05-03-2003 à 23:51:40    

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+
 

Reply

Marsh Posté le 05-03-2003 à 23:55:12    

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 ?
Reply

Marsh Posté le 05-03-2003 à 23:56:00    

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 ?
Reply

Marsh Posté le 05-03-2003 à 23:56:43    

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
Reply

Marsh Posté le 06-03-2003 à 08:48:39    

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

Reply

Marsh Posté le 06-03-2003 à 08:51:55    

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
Reply

Marsh Posté le 06-03-2003 à 09:13:20    

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] ;)

Reply

Marsh Posté le 06-03-2003 à 09:52:24    

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
Reply

Marsh Posté le 06-03-2003 à 10:07:40    

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
Reply

Marsh Posté le 06-03-2003 à 10:14:39    

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
 
 
?

Reply

Marsh Posté le 06-03-2003 à 10:40:28    

Reply

Marsh Posté le 06-03-2003 à 11:19:25    


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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed