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

avec Java Discussion :

Cycle de vie d'une propriété "static final"


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2005
    Messages : 307
    Par défaut Cycle de vie d'une propriété "static final"
    Bonjour à tous,

    Je me pose une question concernant les propriété "static final". Je sais que c'est des propriété partagées par plusieurs objets.
    Mais est-ce qu'ils sont partagés en mémoire ? C'est à dire est-ce que toutes les objets utilisant une même propriété "static final" utilisent le même pointeur vers cette propriété ?

    J'utilise beaucoup de static final dans mes classes pour partager des String ou des objets plus complexe, et je ne voudrais pas saturer la mémoire.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface IMonController{
         static final String PAGE_TITLE = "Le titre de ma page";
         static final Menu   PAGE_MENU  = new Menu("item1", "item2","item3");
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class MonAdminController implements IMonController {
         //...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class MonUserController implements IMonController {
         //...
    }
    Est-ce que MonAdminController et MonUserController partagent les même pointeurs vers les propriétés PAGE_TITLE et PAGE_MENU ? A ce moment là il n'y aurait qu'une seule instance de chaque propriété en mémoire.
    Ou bien est ce que chacune des classes instancie leurs propres propriétés lors de la construction de l'objet ? A ce moment il y aurait autant de propriétés instanciées en mémoire que d'objet ? (et ça serait dommage car il s'agit de constantes ^^)

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par andlio Voir le message
    Je me pose une question concernant les propriété "static final". Je sais que c'est des propriété partagées par plusieurs objets.
    En fait, ce n'est pas comme ça qu'il faut le voir.

    Une propriété "static" est attachée à la classe, et non pas aux instances de cette classe.
    Du coup, elle est partagée entre tous les objets de cette classe, oui, mais elle existe même s'il n'existe aucun objet de cette classe. Elle existe dès que la classe elle-même existe.

    Ça se voit facilement avec les propriétés "public static final" qui peuvent être accédées par d'autres classes, sans jamais instancier la classe d'où elles viennent. C'est le cas de Math.PI par exemple.

    Citation Envoyé par andlio Voir le message
    Mais est-ce qu'ils sont partagés en mémoire ?

    C'est à dire est-ce que toutes les objets utilisant une même propriété "static final" utilisent le même pointeur vers cette propriété ?
    Du coup, oui. Ils utilisent la propriété de la classe.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2005
    Messages : 307
    Par défaut
    Merci thelvin pour cette réponse claire !

    Donc il faut tout de même les utiliser avec parcimonie...

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    les static final dont la valeur est connue à la compilation sont utilisé comme valeur immédiate, il n'y a plus de référence à la classe d'origine.

    ainsi, si je met dans le code de Frame.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maFrame.setTitle(IMonController.PAGE_TITLE);
    c'est compilé de la même manière que si j'avais mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maFrame.setTitle("Le titre de ma page");
    d'ailleurs, si je change PAGE_TITLE sans recompiler Frame.java, c'est toujours l'ancien titre qui sera utilisé.

    Mais comme toutes les strings constantes dans le code passent par intern(), ça ne change rien à l'occupation mémoire, ca économise juste quelque cycle cpu

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par andlio Voir le message
    Donc il faut tout de même les utiliser avec parcimonie...
    ?? Pourquoi ?

    C'est exactement ce qui t'arrange...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 182
    Par défaut
    Citation Envoyé par andlio Voir le message
    Merci thelvin pour cette réponse claire !

    Donc il faut tout de même les utiliser avec parcimonie...
    au contraire, en utilisant static final, ta classe elle-meme fournis aux instances la constante, tes instances ne possedent pas une reference c'est justement le but. Si tu utlisais une variable final non statique, alors dans ce cas-ci tu aurai une constante pour chaque instance ce qui serai asser genant...

    pour comprendre le mot-clé static generalement je m'imagine une petite boite qui est la JVM avec plein d'autres boites a l'interieur qui sont des instances d'une classes, et tout ce qui est statique dans des boites separer que les instances peuvent exploiter à distance.

    d'accord jai beaucoup d'imagination et ce n'est pas 100% juste, mais c'est la seule facon qui ma permis de ne plus jamais oublier`comment fonctionne le mot-clé static.

Discussions similaires

  1. je ne comprend le cycle de vie d'une requête JSF
    Par kisitomomotene dans le forum JSF
    Réponses: 1
    Dernier message: 08/01/2009, 17h51
  2. Cycle de vie d'une page asp.net
    Par lazins dans le forum ASP.NET
    Réponses: 12
    Dernier message: 03/11/2008, 17h50
  3. Cycle de vie d'une servlet
    Par sniper_marra dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 21/08/2008, 14h43
  4. Réponses: 7
    Dernier message: 08/03/2007, 09h23

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