Bean et méthode static

jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 4 octobre 2004 - 25 févr. 2004 à 09:07
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Derniè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:

public static String SousDateHeure

sauriez vous également les conséquence?

24 réponses

kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
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.
0
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Derniè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?
0
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
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.
0
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Derniè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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
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.
0
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Derniè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?
0
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
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 ?
0
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Derniè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?
0
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
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.
0
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Derniè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?
0
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Derniè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();
}

sauriez vous ce qui se passe SVP?
0
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 4 octobre 2004
26 févr. 2004 à 11:58
eee pardon je peut bien de ma class MobileObject mais par contre, je ne peut pas de cette class

public class Client extends Object implements java.io.Serializable, WebServicesInterface {

// Constants:
static Category log = Category.getInstance(Client.class.getName());
private static InitialisationServlet oIServlet=new InitialisationServlet().getInstance();

visiblement il y a quelque chose de différent entre les 2 pusique ces deux class font partie du meme pakadge

sauriez vous ce qui fait la différence et pourquoi?
merci et désolé pour le contre temps
0
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 4 octobre 2004
27 févr. 2004 à 13:50
Bonjour

sauriez vous si cette class pouraais etre static?:

voici le début:

public class Client extends Object implements java.io.Serializable, WebServicesInterface {

// Constants:
static Category log = Category.getInstance(Client.class.getName());
private static InitialisationServlet oIServlet=new InitialisationServlet().getInstance();
0
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
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.
0
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Derniè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;

if (fin >= debut) {
duree= (fin-debut)/1000;
} else {
duree = ((minuit-debut)+fin)/1000;
}

}
catch (Exception e) {
System.out.println("Erreur de 'parse' dans calcul duree ("+heureDebut+"/"+heureFin+") : " +e);
}

return General.trtDuree(duree);
}
0
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
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 ?
0
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 4 octobre 2004
1 mars 2004 à 10:57
Toutes les class font partie du meme package.

jbuilder me dit "méthode non statique ne peut pas être référencé depuis un contexte statique"
0
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
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' ....
0
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 4 octobre 2004
1 mars 2004 à 11:39
à cause de

DateFormat df = DateFormat.getTimeInstance(); ?
0
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
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 ?
0
Rejoignez-nous