jmg02001
Messages postés78Date d'inscriptionjeudi 6 février 2003StatutMembreDernière intervention 4 octobre 2004
-
25 févr. 2004 à 09:07
jmg02001
Messages postés78Date d'inscriptionjeudi 6 février 2003StatutMembreDernière intervention 4 octobre 2004
-
1 mars 2004 à 14:55
Bonjour, sauriez vous pourquoi d'un bean, si je veut appeler une méthode d'un autre bean du mème pakage, sans créer à chaque fois un objet avec
General grl = new General();
grl.SousDateHeure()
si je fais à la place:
General.SousDateHeure()
dans le bean général , je suis aubligé de déclarer la méthode en static:
kirua12
Messages postés1155Date d'inscriptionsamedi 17 janvier 2004StatutMembreDernière intervention29 avril 20117 25 févr. 2004 à 11:31
Salut,
lorsque tu fais General.SousDateHeure() (avec un le premier 's' en minuscule c'est mieux) tu appelles une méthode de classe et non d'instance. Pour signifier que c'est une méthode de classe tu dois mettre le mot clé 'static'.
Suivant ce que tu fais dans cete méthode les conséquences vont de rien à totalement désatreux. Une méthode static manipule les champs static de la classe. Ces champs sont donc 'partagés' par tous ceux qui appelle cette méthode ce qui implique que tu n'as pas forcément le même résultat pour 2 appels consécutifs.
Si tu ne veux pas créer un objet à chaque fois mais ne pas mettre ta méthode static, tu peux utiliser le pattern singleton. Il a d'ailleurs été prévu pour ça.
jmg02001
Messages postés78Date d'inscriptionjeudi 6 février 2003StatutMembreDernière intervention 4 octobre 2004 25 févr. 2004 à 15:18
merci mais je ne vois pas tres bien ce qu'est les champs static .
c'est les variable globale à l'objet déclarées en static?
sinon plusieur utilisateurs peuvent se servir de la méthode statique en mème temps, sans changer la valeur des variables déclarées dans cette méthode pour les autres?
kirua12
Messages postés1155Date d'inscriptionsamedi 17 janvier 2004StatutMembreDernière intervention29 avril 20117 25 févr. 2004 à 15:47
en fait on peut dire que les variables static sont des variables globales mais à la classe seulement. Ce qui implique que si une variable est modifiée par le traitement d'une méthode, lorqu'un autre appel sera fait les valeurs utilisées seront celles de l'appel précédent.
Donc si plusieurs utilisateurs accèdent à cette méthode les valeurs seront modifiées.
Si tu dois remettre à zéro tes variables ce ne sont pas des variables de la classe mais doivent plutôt être passées en paramètre.
jmg02001
Messages postés78Date d'inscriptionjeudi 6 février 2003StatutMembreDernière intervention 4 octobre 2004 25 févr. 2004 à 15:57
ok merci mais ma question tourne sur les variables déclarées uniquement à l'intérieur de la méthode utilisée ces variables étans uniquement fonction des paramètres envoyés à cette méthode, il n'y a donc pas de problèmes d'acces concurentiel?
en d'autre termes le micropresesseur attentant il la fin de la méthode avant de l'utiliser pour un autre utilisateur pour cette meme instance?
Vous n’avez pas trouvé la réponse que vous recherchez ?
kirua12
Messages postés1155Date d'inscriptionsamedi 17 janvier 2004StatutMembreDernière intervention29 avril 20117 25 févr. 2004 à 16:11
pour les variables déclarées juste dans la méthode, elles seront initialisées à chaque appel. De ce côté là pas de pb.
Par contre si tu as plusieurs threads qui accèdent à ta méthode, il faut protéger les accès aux données. Ceci se fait en utilisant le mot clé 'synchronized'.
public synchronized void maMethode(){
...
}
Ta méthode ne sera exécutée que par un seul thread à la fois.
jmg02001
Messages postés78Date d'inscriptionjeudi 6 février 2003StatutMembreDernière intervention 4 octobre 2004 25 févr. 2004 à 16:26
merci mais je ne sais pas si plusieur thread accede à ma méthode à la fois , tout ce que je sais c'est que ayant déclaré ma méthode en statique elle ne cré pas d'autre instance que celle crée par la session (scope session sur le bean de cette class).
mais si un autre utilisateur accede à cette méthode il aura un autre objet de cette class (étant bean de scope session) puisqu'il sera sur une autre cession?
il ùe semble donc que je ne soit pas multithread! esce exacte?
kirua12
Messages postés1155Date d'inscriptionsamedi 17 janvier 2004StatutMembreDernière intervention29 avril 20117 25 févr. 2004 à 16:36
j'ai du mal à comprendre le contexte. Ton bean est sur un serveur d'applications ?
Qui qu'il en soit il n'y a pas d'instance associée à ta méthode static.
Si tu as une nouvelle instance de ton bean pour chaque utilisateur pourquoi veux tu une méthode static ?
Peux tu me donner un peu plus de détails ?
jmg02001
Messages postés78Date d'inscriptionjeudi 6 février 2003StatutMembreDernière intervention 4 octobre 2004 25 févr. 2004 à 16:47
oui mon bean est sur un serveur d'application.
je croyais que ma méthode statique était praticable que par le biais de l'instance de l'objet où il y a cette méthode.
je crois avoir une nouvelle instance de mon bean pour chaque utilisateur puisque mon bean à un scope session.
et je veut une méthode statique car si je fait
General grl = new General();
grl.SousDateHeure()
j'ai une création d'objet à chaques fois que je veut me servir de la méthode SousDateHeure à partir d'un bean du meme pakage
donc j'ai fait à la place:
General.SousDateHeure()
mais dans le bean général , je suis aubligé de déclarer la méthode en static!
ece grave? cette méthode n'utilisant que ses parametres?
kirua12
Messages postés1155Date d'inscriptionsamedi 17 janvier 2004StatutMembreDernière intervention29 avril 20117 25 févr. 2004 à 17:14
oulà j'ai dû raté une marche !!
'General' est ton bean qui est en session ?
Si oui tu peux le récupérer et appeler ta méthode donc pas besoin de méthode static.
Sinon je voie rien qui empêche l'utilisation d'une méthode static. Par contre tu es dans un environnement multithread donc je pense qu'il faut déclarer ta méthode synchronized.
jmg02001
Messages postés78Date d'inscriptionjeudi 6 février 2003StatutMembreDernière intervention 4 octobre 2004 25 févr. 2004 à 18:08
merci mais si apparemment,
à info[14] = General.SousDateHeure(lastTime2, firstTime);
jbuilder me dit "méthode non statique ne peut pas être référencé depuis un contexte statique"
si dans le bean General je ne déclare pas SousDateHeure en statique.
ors que la méthode d'ou j'appel General.SousDateHeure n'est pas statique et la class de cette méthode est n'est pas déclarée comme statique
si je met synchronized je peut lesser statique ou il faut que je l'enleve?
public synchronized void maMethode(){
il y a 1 seul utilisateur pas session, mes beans étant en scope session et lancant méthode par méthode je ne peut donc pas avoir plusieur thread par objet?
non?
jmg02001
Messages postés78Date d'inscriptionjeudi 6 février 2003StatutMembreDernière intervention 4 octobre 2004 26 févr. 2004 à 11:30
j'ai cru au début que c'est parce que je faisais appel a une methode non statique ds une méthode statique.
mais ma méthode d'où j'appel General.SousDateHeure() n'a pas l'ère statique!
voici sa déclaration:
public class MobileObject {
static Category log = Category.getInstance(MobileObject.class.getName());
public MobileObject() {
log.debug("Creation de l'objet MobileObject");
}
public static void main(String[] args) {
MobileObject mobileObject1 = new MobileObject();
}
kirua12
Messages postés1155Date d'inscriptionsamedi 17 janvier 2004StatutMembreDernière intervention29 avril 20117 29 févr. 2004 à 23:14
Salut,
une classe n'est pas static, seules les méthodes le sont.
Pour ta méthode si tu es sûr qu'il n'y a qu'un utilisateur à la fois tu n'es pas obligé de mettre synchronized et si j'ai compris ton problème tu peux mettre ta méthdoe static.
Pour répondre à ton problème d'accés depuis un autre objet, il faudrait que tu montres un peu plus ton code.
jmg02001
Messages postés78Date d'inscriptionjeudi 6 février 2003StatutMembreDernière intervention 4 octobre 2004 1 mars 2004 à 09:35
dans Genreral.java
public static String trtDuree(long duree) {
int heure = (int) (duree / 3600);
int minute = (int) ( (duree - (heure * 3600)) / 60);
int seconde = (int) (duree % 60);
return Integer.toString(heure)+":"+((minute>9)?"":"0")+Integer.toString(minute)+":"+((seconde>9)?"":"0")+Integer.toString(seconde);
}
dans Client.java
public String calculDuree(String heureDebut, String heureFin, int type) {//
long plusuneheure = 3600000;
long duree = 0;
DateFormat df = DateFormat.getTimeInstance();
try {
long debut = df.parse(heureDebut).getTime();
long fin = df.parse(heureFin).getTime();
//long minuit = df.parse("23:59:59").getTime()+plusuneheure;
long minuit = df.parse("24:00:00").getTime()+plusuneheure;
kirua12
Messages postés1155Date d'inscriptionsamedi 17 janvier 2004StatutMembreDernière intervention29 avril 20117 1 mars 2004 à 09:53
Je vois rien d'anormal. Quand tu dis que tu ne peux pas appeller ta méthode, il se passe quoi exactement ?
Tu n'aurais pas un problème d'accès : classe General qui a un accès package et tes 2 classes ne sont pas dans le même package ?
kirua12
Messages postés1155Date d'inscriptionsamedi 17 janvier 2004StatutMembreDernière intervention29 avril 20117 1 mars 2004 à 11:25
étrange, j'ai compilé et testé ton code et tout se passe bien.
La seule explication que je voie pour le moment est que le problème ne vient pas de l'appel à la méthode 'trtDuree' mais plutôt de 'calculDuree' ....
kirua12
Messages postés1155Date d'inscriptionsamedi 17 janvier 2004StatutMembreDernière intervention29 avril 20117 1 mars 2004 à 11:48
J'ai copié-collé ton code dans Eclipse avec le JDK 1.4.1 et ça marche très bien.
JBuilder ne te dit pas où est l'erreur car là je ne voie pas du tout ?