Une bonne grosse variable globale, en Java, y a vraiement pas moyen !?

Une bonne grosse variable globale, en Java, y a vraiement pas moyen !? - Java - Programmation

Marsh Posté le 01-07-2002 à 11:53:11    

bon, comme certains le savent déja, je viens du C/C++ (j'y suis encore pas mal d'ailleurs !)
Si j'étais en C++, j'aurais fait une variable globale, c pas bien y parait, ms j'trouve que si ça se limite à une, voire 2 ds un programme, c pas gênant, et vachement plus simple qd même.
Parce que, là, je vois pas bien comment faire sans trop m'emmerder la vie. Je m'explique.
J'ai écrit une servlet. ds le code de cette servlet, il y a pas mal de chaine de caractères en dur, c pas top. Alors maintenant, je voudrais mettre tout ça dans un fichier properties, et utiliser un ResourceBundle.
Mais ce truc là, je vais quand même pas le mettre en paramètre de toutes les fonctions qui doivent utiliser un libellé !? je vais pas non plus le mettre comme membre de tous les objets qui utilisent un libellé. Donc, quelle est la méthode "commune" pour ce genre de trucs !? j'en fais quoi de mon Bundle moi !?

Reply

Marsh Posté le 01-07-2002 à 11:53:11   

Reply

Marsh Posté le 01-07-2002 à 11:54:12    

un objet statique que tu initialises au début et qui fournit le label sur base d'un id ou autre.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 01-07-2002 à 11:55:39    

heu... tu peux développer un peu ? g jammais utilisé d'objets statiques...

Reply

Marsh Posté le 01-07-2002 à 11:59:56    

Code :
  1. public class Resource {
  2.     private static Resource res = new Resource();
  3.     private Resource() {
  4.          // tu fais ce que tu veux lorsque tu crées ton instance unique ici
  5.     }
  6.     public static Resource getResource() {
  7.           return res;
  8.     }
  9.     public void setup() {
  10.        // ici tu initialises ton ressourcebundle en tapant par exemple la correspondance entre id et label dans une hashmap
  11.     }
  12.     public String getLabel(String id) {
  13.           // ici tu regardes dans ta hashmap si il y a un label qui correspond à l'id. Si oui tu le renvoies si non tu peux crée une exception ou renvoyez null... A toi de voir
  14.     }
  15.  
  16. }


 
Ensuite dans ton code là où tu veux le label pour window.title (dans ton fichier properties tu as à un moment donné:
 
windows.title=Le titre de ma fenêtre
 

Code :
  1. Resource r = Resource.getResource();
  2. String title = r.getLabel("window.title" );


 
bien sur il ne faut pas oublie de faire un setup du resource dans ton main (au début  de ton programme)


Message édité par darklord le 01-07-2002 à 14:12:41

---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 01-07-2002 à 12:05:29    

Excellent, c exactement ce que j'aurais bien voulu faire, je voyais pas comment. Merci encore...
Tu veux pas te mettre au C++ !? histoire que je puisse te rendre l'appareil ! :D

Reply

Marsh Posté le 01-07-2002 à 14:13:09    

el_gringo a écrit a écrit :

Excellent, c exactement ce que j'aurais bien voulu faire, je voyais pas comment. Merci encore...
Tu veux pas te mettre au C++ !? histoire que je puisse te rendre l'appareil ! :D




 
 :hello:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 01-07-2002 à 22:34:36    

Euhhhh...Je suis d'accord avec Dark, sauf dans ton cas : je m'explique : pour les servlets, il faut absolument éviter ce qui est statique pour des valurs qui pourraient être amenées à changer d'une exécution à l'autre : typiquement, un ResourceBundle dans un environnemen,t multilangue (pour l'instant, tu n'as peut êre qu'une langue, mais tu pourrais avoir envie d'internationaliser ton truc) Et là, c'est plus chiant : il vaut beaucoup mieux instancier ton bundle, et le mettre dans la session...Comme ça, il est particuler à la session, et 2 utilisateurs qui veulent des langues différentes peuvent les avoir;...Sinon, ça risque de poser problème.

Reply

Marsh Posté le 01-07-2002 à 22:48:07    

gfive a écrit a écrit :

Euhhhh...Je suis d'accord avec Dark, sauf dans ton cas : je m'explique : pour les servlets, il faut absolument éviter ce qui est statique pour des valurs qui pourraient être amenées à changer d'une exécution à l'autre : typiquement, un ResourceBundle dans un environnemen,t multilangue (pour l'instant, tu n'as peut êre qu'une langue, mais tu pourrais avoir envie d'internationaliser ton truc) Et là, c'est plus chiant : il vaut beaucoup mieux instancier ton bundle, et le mettre dans la session...Comme ça, il est particuler à la session, et 2 utilisateurs qui veulent des langues différentes peuvent les avoir;...Sinon, ça risque de poser problème.




mpoi y'a pas d'accord
une belle classe singleton qui "cache" les resourcebundle pour les langues dont on a besoin et vala
-> pas besoin de les charger à chaque fois
-> instanciés une seule fois dans la jvm
 

Reply

Marsh Posté le 01-07-2002 à 23:07:41    

juste un truc pour la solution de dark : plutot que de mettre une method setup qu'il faudra appeler (où ??? quand ???), autant utiliser un bloc static :  
 

Code :
  1. public class Resource {
  2.    private static Resource res;
  3.    private Resource() {  ...  }
  4.    public static Resource getResource() { return res;  }
  5.    public String getLabel(String id) { ... }
  6.    // bloc s tatic
  7.    {
  8.       res = new Ressource();
  9.       res.setMachin();
  10.       ...
  11.    }
  12. }


Message édité par benou le 01-07-2002 à 23:08:45
Reply

Marsh Posté le 01-07-2002 à 23:09:18    

benou a écrit a écrit :

juste un truc pour la solution de dark : plutot que de mettre une method setup qu'il faudra appeler (où ??? quand ???), autant utiliser un bloc static :  
 




 
bah ou plus simple
(bon j'ai pas son code sous la main mais...)
style
if (instance==null) {
 instance = new Truc();
 instance.setup()
}
 
mais bon, je sais d'ou il les sors les méthodes ces methodes setup le dark, c'est qu'il est influençable ! (provoc inside)

Reply

Marsh Posté le 01-07-2002 à 23:09:18   

Reply

Marsh Posté le 01-07-2002 à 23:43:35    

je les sors de nul part ;) C'est juste un example que j'ai pondu sans vraiment réfléchir. Effectivement tu peux t'arranger pour que le bloc getResource initialise le singleton (et c'est meme mieux comme ca)
 
La solution de greg est la meilleure à mon avis. Pour peu que resource à tout ce dont il a besoin à disposition (comme ce fameux ressource bundle. Si ce n'est pas le cas tu devrais faire effectivemnt un méthode statup statique qui prendrait en param tout ce dont tu as besoin.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 02-07-2002 à 07:49:04    

--greg-- a écrit a écrit :

 
mpoi y'a pas d'accord
une belle classe singleton qui "cache" les resourcebundle pour les langues dont on a besoin et vala
-> pas besoin de les charger à chaque fois
-> instanciés une seule fois dans la jvm
 
 




 
J'ai pas dit que j'étais pas d'accoird!!!
Mais dans le cas particulier des Servlets, tu met pas ton ResourceBundle en statique dans ta servlet, sinon, tu t'exposes à des problèmes! Effectivement, la classe Singleton (j'aime pôs ce mot!) est une solution qui marche. Ce que je voulais dire, c'est que avec l'exemple de Dark, i ne faut surtout pas écrire dans une servlet :
 
public static Resource r = new Resource()
...
 
Sinon, tu vas te faire avoir dès que tu passes en multilangue.
 
Et le fait de le mettre dans la session, ça permet aussi de pas le réinstancier à chaque fois, que je sache..

Reply

Marsh Posté le 02-07-2002 à 09:43:49    

gfive a écrit a écrit :

 
 
J'ai pas dit que j'étais pas d'accoird!!!
Mais dans le cas particulier des Servlets, tu met pas ton ResourceBundle en statique dans ta servlet, sinon, tu t'exposes à des problèmes! Effectivement, la classe Singleton (j'aime pôs ce mot!) est une solution qui marche. Ce que je voulais dire, c'est que avec l'exemple de Dark, i ne faut surtout pas écrire dans une servlet :
 
public static Resource r = new Resource()
...
 
Sinon, tu vas te faire avoir dès que tu passes en multilangue.
 
Et le fait de le mettre dans la session, ça permet aussi de pas le réinstancier à chaque fois, que je sache..




 
Ouais, mais attacher à une Session, ça veut dire que je vais devoir passer mon instance de Ressource comme paramètre de toutes les méthodes qui nécessitent un libellé et qui n'ont pas accès à l'instance d'HttpServletRequest.
ça craint !!!
en plus, ça veut dire une instance par Utilisateur !! c pas la peine.
Je pourrais plutot faire un Singleton (une seule instance static pour ma Servlet), et attacher une String "language" à chaque Session quand je voudrais faire du multi-lingue
ça poserai pb ça !?


Message édité par El_gringo le 02-07-2002 à 09:45:57
Reply

Marsh Posté le 02-07-2002 à 10:14:54    

alors...?

Reply

Marsh Posté le 02-07-2002 à 10:37:12    

y a personne aujourd'hui ?

Reply

Marsh Posté le 02-07-2002 à 10:40:53    

et oh fait pas ton boolay hein :o


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 02-07-2002 à 10:44:29    

DarkLord a écrit a écrit :

et oh fait pas ton boolay hein :o




 
Bah quoi !? t'as pas envie de m'répondre aujourd'hui ?

Reply

Marsh Posté le 02-07-2002 à 10:50:42    

tu sais je travaille hein ! Et bon là pour le moment j'ai un gros switch a faire d'intégration en production ... C'est pas HFR qui paye mon loyer :o
 
 :fou:  
 


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 02-07-2002 à 10:55:45    

DarkLord a écrit a écrit :

tu sais je travaille hein ! Et bon là pour le moment j'ai un gros switch a faire d'intégration en production ... C'est pas HFR qui paye mon loyer :o
 
 :fou:  




 
...'faut pas s'énerver non plus ! Si t'étais pas sur HFR, t'aurais même pas vu mon message.
c pas moi qui t'ai fait venir non plus. Ms, tant qu'a faire, si t là, j'aurai bien aimé que tu m'donne un de tes fameux coup de pouce.

Reply

Marsh Posté le 02-07-2002 à 11:08:50    

non mais je comprends. J'ai du temps pendant que je fais des réplicas de BD ou lorsque j'attends le résultat de certaints tests qui peuvent prendre plusieurs minutes (comme now).
 
Mais bon pour ta question JSP/Servlet c'est plus trop mon truc pour le moment ..


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 02-07-2002 à 11:14:51    

DarkLord a écrit a écrit :

non mais je comprends. J'ai du temps pendant que je fais des réplicas de BD ou lorsque j'attends le résultat de certaints tests qui peuvent prendre plusieurs minutes (comme now).
 
Mais bon pour ta question JSP/Servlet c'est plus trop mon truc pour le moment ..




 
Hooo... Darklord qui essaye de faire croire qu'il ignore un truc en Java, allons ! :D
Non, bon, tant pis, de toute façon, sur cette question là, je pense que g raison, je vais faire ce que je dis, j'verrais bien.
Ms c sur ça plutot que je me pose vraiement la question: (en plus c pas lié aux servlets ça, c pour tout truc Java)
http://forum.hardware.fr/forum2.ph [...] ubcat=#bas

Reply

Marsh Posté le 02-07-2002 à 11:16:57    

el_gringo a écrit a écrit :

 
 
Hooo... Darklord qui essaye de faire croire qu'il ignore un truc en Java, allons ! :D




 
bien sûr c'est vraiment mon genre ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 02-07-2002 à 11:26:45    

tain j'hallucine je lui donne LA solution et il rale:)

Reply

Marsh Posté le 02-07-2002 à 11:28:07    

gfive a écrit a écrit :

 
[...] Effectivement, la classe Singleton (j'aime pôs ce mot!) est une solution qui marche.[...]



 
tu preferes "celibataire"? :o
et euh ça prete à confusion d'écrire "classe Singleton", du coup on croit que tu parles du nom de la classe.

Reply

Marsh Posté le 02-07-2002 à 11:46:08    

--greg-- a écrit a écrit :

tain j'hallucine je lui donne LA solution et il rale:)




 
Tu peux aussi me parler à la 2e personne du singulier, c pas mal, essaye pr voir !
G pas râlé. c que GFive a remis ton truc en cause pour le case d'une servlet. Alors du coup, j'essaye de proposer une solution qui permettrait d'adapter TA solution (merveilleuse solution d'ailleur !:D) au cas ou elle est utilisée ds une servlet...

Reply

Marsh Posté le 02-07-2002 à 11:49:52    

el_gringo a écrit a écrit :

 
 
Tu peux aussi me parler à la 2e personne du singulier, c pas mal, essaye pr voir !
G pas râlé. c que GFive a remis ton truc en cause pour le case d'une servlet. Alors du coup, j'essaye de proposer une solution qui permettrait d'adapter TA solution (merveilleuse solution d'ailleur !:D) au cas ou elle est utilisée ds une servlet...



meuh non il l'a pas remis en cause, il a juste expliqué son propre propos(parce que je disais que gt pas d'accord etc), et il a dit que ma solution "marchait"

Reply

Marsh Posté le 02-07-2002 à 11:50:12    

:o


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 02-07-2002 à 11:55:34    

Bon, ça me saoule, j'arrive pas à faire comprendre ce que je voulais. De toute façon, c'est bon, y a plus de pb...

Reply

Marsh Posté le 02-07-2002 à 12:16:11    

benou a écrit a écrit :

juste un truc pour la solution de dark : plutot que de mettre une method setup qu'il faudra appeler (où ??? quand ???), autant utiliser un bloc static :  
 

Code :
  1. public class Resource {
  2.    private static Resource res;
  3.    private Resource() {  ...  }
  4.    public static Resource getResource() { return res;  }
  5.    public String getLabel(String id) { ... }
  6.    // bloc s tatic
  7.    {
  8.       res = new Ressource();
  9.       res.setMachin();
  10.       ...
  11.    }
  12. }






 
ha, tient, j'avais pas vu...
c quoi un bloc static ? le bout de code est  exécuté une fois, à la première instanciation de la classe, c ça ?

Reply

Marsh Posté le 02-07-2002 à 12:22:25    

ouais tu fais
 
static {
 
   // Tes brols
}
 


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 02-07-2002 à 12:25:43    

DarkLord a écrit a écrit :

ouais tu fais
 
static {
 
   // Tes brols
}
 
 




 
c mal vu en POO, non ?
le mot clé "static", il l'avait oublié le benou ?

Reply

Marsh Posté le 02-07-2002 à 12:31:11    

très mal meme mais bon il faut etre pragmatique dans la vie et pour le mot clé aucune idée. J'ai jamais vu sans en tout cas.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 02-07-2002 à 12:53:20    

Baaah non pas tellement mal... le new peut être considèré comme static... ce qui est mal c'est de violé les principes de parnas (Parnas principles).
Puis le Singleton est surtout utilisé pour contrôler le nombre d'instances d'une classe (regardez le livre de GoF)... pcq les variables globales... c'est môche  :(


---------------
Belgian Connection
Reply

Marsh Posté le 02-07-2002 à 20:03:22    

el_gringo a écrit a écrit :

 
 
c mal vu en POO, non ?
le mot clé "static", il l'avait oublié le benou ?




ouais. shame on me :(

Reply

Marsh Posté le 03-07-2002 à 05:35:57    

MelloW a écrit a écrit :

Baaah non pas tellement mal... le new peut être considèré comme static... ce qui est mal c'est de violé les principes de parnas (Parnas principles).
Puis le Singleton est surtout utilisé pour contrôler le nombre d'instances d'une classe (regardez le livre de GoF)... pcq les variables globales... c'est môche  :(  




 
non mais là on parlait du bloc static dans la classe pas du singleton pattern. Le singleton pattern est tout à fait objet, y a pas de problème à ce niveau là

Reply

Marsh Posté le 03-07-2002 à 10:42:37    

ok, j avais pas bien vu  :sweat:
connaissais même pas les blocs static...


---------------
Belgian Connection
Reply

Marsh Posté le 03-07-2002 à 10:57:06    

DarkLord a écrit a écrit :

 
 
non mais là on parlait du bloc static dans la classe pas du singleton pattern. Le singleton pattern est tout à fait objet, y a pas de problème à ce niveau là




 
D'ailleur, dans le truc de benou, tu vois un intéret à mettre ce bloc static, plutot que d'initialiser Resources au moment de la construction du singleton ?

Reply

Marsh Posté le 03-07-2002 à 11:04:18    

ca dépend. Générallement un constructeur est fait pour créer une instance d'un objet. Le setup est différent. Je veux dire par là que tu peux faire un tas d'opérations complexes et que ca n'a pas sa place dans le constructeur.
 
Mais pour des cas simples tu peux appeller une méthode privée setup() ou écrire directement le code dans le constructeur.
 


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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