IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

classe statique objet


Sujet :

Langage Java

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut classe statique objet
    Bonjour,

    je voulais avoir quelques précisions concernant les classes statiques: quelle est leur durée de vie ?

    Je m'explique: je dois modifier une application java, qui communique avec une base de données. telle qu'elle était avant, pour des données géographiques, les données étaient entrées directement dans le code, dans une classe statique.
    il suffisait d'appeler cette classe.
    Geographic.getCountry("france") ;
    Ne trouvant pas cela très joli, j'ai donc déplacé les données en base, mais pour leur appel, plutôt que d'appeler la base à chaque fois, vu que ce sont des données constantes, j'ai souhaité conserver l'utilisation d'une classe statique.

    Donc ma classe a un attribut List, ou je liste tous les pays. Une méthode init() initialise la liste à partir de la base.

    ensuite pour mes accesseurs, ça donne à peu près
    public static Country getcountry() {
    // pour le premier appel
    if (myList==null)
    init() ;
    //traitement sur mylist et retour du pays
    }
    en regardant les traces, j'ai l'impressions que init() est appelée plusieurs fois, pas à chaque utilisation des accesseurs cependant.
    Je pensais qu'elle ne serait appellée qu'une seule fois, au premier appel, car je pensais qu elecycle de dvie d'une classe statique correspondait à celui de l'application, et idem pour ses attributs...

    Quelqu'un pourrait méclairer ?
    Merci

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Bonsoir,
    je ne vois rien à redire à ton implémentation, elle est tout à fait correcte. Il faut être sûr que init() n'est appelée qu'une seule fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public static Country getCountry() {
      if (myList == null) {
        init() ;
      }
     
      ...
      return country;
    }
     
    private static List myList;
     
    private static void init() {
      // au pire : if (myList == null) {
      myList = new ArrayList();
      ...
      // }
    }

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    merci pour ta réponse, ça appuie ce que je pensais mais dont je n'étais pas sûr... Vu qu'il s'agit d'une application déployée sur un serveur d'appli, le cycle de vie n'est peut être pas le même qu'une application java classique.

    Je vais continuer à tracer l'appel à init, pour comprendre ce qu'il se passe.

    Merci

  4. #4
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Citation Envoyé par drKzs
    merci pour ta réponse, ça appuie ce que je pensais mais dont je n'étais pas sûr... Vu qu'il s'agit d'une application déployée sur un serveur d'appli, le cycle de vie n'est peut être pas le même qu'une application java classique.

    Je vais continuer à tracer l'appel à init, pour comprendre ce qu'il se passe.

    Merci

    Sur un serveur d'application J2EE, chaque containeur a son propre classloader qui vont charger leur propre définition des classes.

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    hmmm... et comment sont réparties les utilisations des containers ?

  6. #6
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Citation Envoyé par drKzs
    hmmm... et comment sont réparties les utilisations des containers ?
    Pour faire simple:

    1x containeur par ejbjar "standalone"
    1x containeur par ear (qui possédera donc plusieurs ejbjar gérés par le même containeur)

  7. #7
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Petite remarque, il ne faut pas synchronizer tout ça pour que plusieurs threads n'interviennent pas conjointement (il peut arriver que un thread soit en train de créer l'objet dans init(); pendant qu'un autre thread passe dans la cas du if et donc que le tet myList == null soit vrai aussi...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static synchronized Country getcountry() {
      // pour le premier appel
      if (myList==null)
        init() ;
      //traitement sur mylist et retour du pays
    }

  8. #8
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Citation Envoyé par thibaut
    Petite remarque, il ne faut pas synchronizer tout ça pour que plusieurs threads n'interviennent pas conjointement (il peut arriver que un thread soit en train de créer l'objet dans init(); pendant qu'un autre thread passe dans la cas du if et donc que le tet myList == null soit vrai aussi...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static synchronized Country getcountry() {
      // pour le premier appel
      if (myList==null)
        init() ;
      //traitement sur mylist et retour du pays
    }
    Juste pour chipoter, moi j'aurais juste synchronize la methode init, et deplacer le test (myList == null) au debut de cette methode.

    Synchronizer getCountry et plus dommageable car cela veut dire que l'on ne peut pas faire un getUser par exemple en meme temps alors que seul l'init ne doit pas etre fait de maniere concurrente.

    Bulbo

  9. #9
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Quel chieur celui-là ...

Discussions similaires

  1. Classe et objet + Modules standards
    Par Girzi dans le forum Modules
    Réponses: 2
    Dernier message: 03/11/2006, 22h23
  2. Classe statique en C++ ?
    Par oodini dans le forum C++
    Réponses: 9
    Dernier message: 18/10/2006, 14h31
  3. Réponses: 4
    Dernier message: 16/08/2006, 10h19
  4. Classe statique
    Par jeje99 dans le forum Langage
    Réponses: 12
    Dernier message: 04/01/2006, 17h50
  5. Classes et objets...
    Par cyrpaut dans le forum Général Python
    Réponses: 2
    Dernier message: 20/11/2005, 21h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo