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

Java Discussion :

utilisation de Static


Sujet :

Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 10
    Points : 3
    Points
    3
    Par défaut utilisation de Static
    Bonjour,

    Je pose une question bête mais elle me gène trop surtout que je commence à approfondir en JAVA : quel est l'utilité du mot clé Static.

    Dans quel cas je doit utiliser Static est ce que c'est uniquement pour les thread seulement ? car j'ai mal à la tête à cause de Static.

    Merci.

  2. #2
    Membre confirmé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Points : 490
    Points
    490
    Par défaut
    Bonjour,

    Les variables statiques n'existent qu'en un seul exemplaire pour toutes les instances de la classe, au contraire des variables objet.
    Elles sont utilisables sans avoir besoin d’instancier la classe.

    Les méthodes statiques sont de même utilisables sans avoir besoin d’instancier la classe.

    C'est ainsi que le main du programme peut être lancé par la JVM , sans avoir été instancié.
    N'oubliez pas la balise

    est ton ami mais quand Google ne trouve pas quelque choses, il demande à Chuck Norris.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Java/JavaEE
    Inscrit en
    Août 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java/JavaEE

    Informations forums :
    Inscription : Août 2014
    Messages : 194
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    static est utilisé pour les variables dont on souhaite n'avoir qu'une seule instance dans notre projet, comme ça on pourrait accéder à leur contenu depuis n'importe quelle autre classe et même de lui affecter une nouvelle valeur qui sera partagée par toutes les classes.

  4. #4
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Il y a plusieurs cas d'utilisation de static
    - sur les propriétés
    - sur les méthodes

    Quand tu mets le mot clé statique sur une propriété ou une méthode, tu déclares l'élément comme un élément de la classe et pas de l'instance (importance de faire la différence entre une classe et une instance de la classe ici, l'instance, c'est quand tu fais new)
    Ce qui veut dire qu'une méthode statique est disponible partout à partir de la définition de la classe sans avoir à instancier la dire classe. Par exemple, la méthode String.valueOf est une méthode statique que tu appelles à partir de la classe String et pas à partir d'une instance de String.

    Un attribut statique est disponible au niveau de la classe, et pas que au niveau des instances. Par contre, il faut savoir qu'il n'existe toujours qu'une seule Classe par fichier ".java" chargée par le ClassLoader qui permet de générer les instances : donc tout attribut déclaré en tant que "static" est accessible partagé par toutes les instances de la classe (ce qui fait que si une instance modifie la valeur, toutes les instance auront accès à cette nouvelle valeur)

    Une méthode statique ne peut pas "voir" les éléments propres à une instance de la classe (tout ce qui n'est pas statique).


    Globalement, on utilise le mot clé static dans deux cas
    - pour les méthodes dans le cas où on n'a pas besoin de propriétés d'une instance d'objet pour obtenir un résultat voulu
    - pour les attributs quand on veut partager une propriété commune à toutes les instances (typiquement, les loggers comme log4j, ce qui permet de limiter le nombre d'instances de logger existant en mémoire)
    Je ne suis pas mort, j'ai du travail !

  5. #5
    Membre confirmé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Points : 490
    Points
    490
    Par défaut
    static son utilisation n'est pas préconisé
    N'oubliez pas la balise

    est ton ami mais quand Google ne trouve pas quelque choses, il demande à Chuck Norris.

  6. #6
    Membre éclairé Avatar de Sennad
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 180
    Points : 703
    Points
    703
    Par défaut
    Citation Envoyé par Diablo_22 Voir le message
    static son utilisation n'est pas préconisé
    Qu'est ce que tu entends par là ?
    C'est très utile, et très utilisé, voir même conseillé..
    -----------------------------------------------------------------------------------------
    Don't play with fire if u don't wanna get burn ! Clinton - Fearon
    ____________________________________________________Pensez au

  7. #7
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 262
    Points : 634
    Points
    634
    Par défaut
    Citation Envoyé par hagane1 Voir le message
    Bonjour,
    Je pose une question bête mais elle me gène trop surtout que je commence à approfondir en JAVA : quel est l'utilité du mot clé Static.
    Dans quel cas je doit utiliser Static est ce que c'est uniquement pour les thread seulement ? car j'ai mal à la tête à cause de Static.
    Merci.
    Ta question n'a rien de bête, mais il faut dire que c'est pas aisé de dire clairement dans quel cas on utilise le mot clé static..
    C'est en fonction des besoins.Ce qu'il faut savoir c'est ce que les uns et les autres ont déjà dit :
    • les variables, les classes internes ou les méthodes statiques sont communes à toutes les instances de la classe dans laquelle elle sont définies.
    • elles sont accessibles même sans avoir instancier d'objet.
    • elles existent en une seule copie.
    • elles peuvent être initialisées avant tout appel de constructeur.
    • ...


    Prenons l'exemple d'une classe compte bancaire ( Compte ) où on a besoin de connaître le nombre de compte bancaire crées dans un programme.
    A ton avis comment vas-ton procéder ?
    C'est là effectivement l'un des intérêt de ce mot clé static. Il suffit tout simplement de créer une variable statique et songer à incrémenter celui-ci
    dans les différents constructeurs de la dite classe.
    Ce n'est qu'un exemple parmi tant d'autres. J'ai été trop bavard mais j'espère avoir dit quelque chose de compréhensible.
    Aujourd'hui apprenant, demain appreneur.
    N'accuse pas le puits d'être trop profond,
    c'est peut-être ta corde qui est trop courte

  8. #8
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par lankoande Voir le message
    Prenons l'exemple d'une classe compte bancaire ( Compte ) où on a besoin de connaître le nombre de compte bancaire crées dans un programme.
    A ton avis comment vas-ton procéder ?
    C'est là effectivement l'un des intérêt de ce mot clé static. Il suffit tout simplement de créer une variable statique et songer à incrémenter celui-ci
    dans les différents constructeurs de la dite classe.
    Ce n'est qu'un exemple parmi tant d'autres. J'ai été trop bavard mais j'espère avoir dit quelque chose de compréhensible.
    Dans ce cas précis, je déconseille fortement l'utilisation de static... Une variable statique est un élément global à la classe, qui est accessible aux instance. Ici, tu utilises le système pour ne pas implémenter un compteur. Tu utilises une possibilité qui supprime l'orientation objet du programme.
    Si tu veux connaitre le nombre de comptes bancaires créés, tu incrémentes un compteur dans une factory, tu n'incrémentes pas un compteur dans un constructeur.
    Si tu veux traiter une données, tu l'encapsules dans un objet.
    Dans ton exemple, tu crées un objet de type Factory (singleton) qui sera chargé de l'instanciation de tes objets Compte et dans lequel tu auras un mis compteur.

    Reprenons ton exemple dans l'autre sens : tu as des objets qui doivent hériter de ton objet Compte, pour créer par exemple un CompteJoint. A ton avis, vont-ils hériter du compteur présent dans "Compte" ? Est-ce que celui-ci va être incrémenté quand tu vas créer un CompteJoint ? Est-ce que tu veux qu'il soit incrémenté? Comme faire le distinguo entre le nombre de Compte et de CompteJoin créés?
    Es-tu sûr que tu veux compter tous les objets instanciés dans ton code à chaque fois que tu fais un new? Comment être sûr que tu maîtrises l'instanciation de tous tes objets (si tu utilises un framework qui fonctionne par reflexivité par exemple)? Que se passe t-il si tu tente de la sérialisation/desérialisation de tes objets?
    Dans ton cas, tu ne pourras plus maîtriser la cohérence de ta donnée, parce qu'elle pourra être modifiée à plusieurs endroits sans que tu en ai le contrôle.


    Une variable statique devrait être "private" (visible uniquement à l'intérieur de la classe), ou static final (ce qui en fait une constante), et utilisé dans des cas très précis (pas un compteur du nombre d'instances)
    Je ne suis pas mort, j'ai du travail !

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    merci pour vos réponses afin de m'aider, quand j'ai lisait vos interventions une remarque me venait dans ma tête :

    quelle est la différence entre une méthode d'instance et une méthode de classe (je sais maintenant que méthode d'instance propre à une instance uniquement et méthode de classe visible à

    toutes les instances ) : on peut modifier l’état d'un objet avec une méthode de classe sans que ses modifications atteignent un autre objet sachant que les propriétés de la classe ne sont Static

    mais uniquement les méthodes.

    Est ce que ce point de vue est correct ?

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Non mais la différence, c'est juste que la méthode static ne décrit pas l'action d'un objet en particulier. Alors que les méthodes d'instance, décrivent une action effectuée par cette instance, avec accès direct aux variables de cette instance.
    Prenons l'exemple d'un simple getter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public String getName() {
      return name;
    }
    Ça ne peut pas être static, tout simplement parce qu'en static, on ne sait pas sur quel objet aller chercher la variable name.
    Au fond une méthode static n'est pas très différente d'une simple fonction dans d'autres langages. C'est juste qu'elle est "rangée" dans une classe.

    Les méthodes static peuvent modifier l'état des objets de la même classe que la méthode, si on donne en paramètre un tel objet à modifier... C'est pas forcément très intelligent de le faire mais rien ne l'empêche.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    J'ia pas tout compris ta phrase, mais on peut effectivement avoir des méthodes statiques qui permettent la manipulation d'instances de la classe

    Exemple
    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
    18
     
    public class Bonhomme{
        private String name;
        private int age;
     
        public Bonhomme(String name, int age){
            this.name = name;
            this.age = age;
        }
     
        public String getName(){
            return name;
        }
     
        public static int sommeDesAges(Bonhomme b1, Bonhomme b2){
            return b1.age + b2.age;
        }
    }
    Ici, dans ce bout de code, on n'a pas accès à la variable age qui est privée et pour laquelle il n'y a pas de getter (ce qui est une horreur, on est d'accord).
    J'ai créé une méthode statique qui permet de faire la somme des ages de deux instances.
    L'intérêt est que ta méthode statique peut "voir" directement les attributs privés de ta classe, ce qui permet de garder des éléments bien encapsulés/cachés dans une classe sans aucun risque de les voir se promener ailleurs (par héritage si tu utilises le mot clé protected par exemple).

    On aurait pu faire mieux et faire une méthode qui prend autant de paramètres qu'on veut histoire que ça soit utile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        public static int sommeDesAges(Bonhomme... listeBonhommes){
            int sommeDesAges = 0;
            if (listeBonhommes != null){
                for (Bonhomme b : listeBonhommes){
                    sommeDesAges += b.age;
                }
            }
            return sommeDesAges ;
        }

    Bref, ta méthode statique, elle est là pour manipuler les instances d'objets. Dans mon exemple, elle permet aussi de récupérer des données qui ne sont pas visibles en dehors de la classe.
    Je ne suis pas mort, j'ai du travail !

  12. #12
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 262
    Points : 634
    Points
    634
    Par défaut
    Citation Envoyé par eulbobo Voir le message
    Dans ce cas précis, je déconseille fortement l'utilisation de static... Une variable statique est un élément global à la classe, qui est accessible aux instance. Ici, tu utilises le système pour ne pas implémenter un compteur. Tu utilises une possibilité qui supprime l'orientation objet du programme.
    Si tu veux connaitre le nombre de comptes bancaires créés, tu incrémentes un compteur dans une factory, tu n'incrémentes pas un compteur dans un constructeur.
    Si tu veux traiter une données, tu l'encapsules dans un objet.
    Dans ton exemple, tu crées un objet de type Factory (singleton) qui sera chargé de l'instanciation de tes objets Compte et dans lequel tu auras un mis compteur.
    Merci pour la profonde analyse. Mon exemple je l'ai juste donné pour illustrer une possibilité d'utiliser le mot clé static. C'est juste un exemple d'école , même si au fond c'est pas un "bon exemple". !
    Aujourd'hui apprenant, demain appreneur.
    N'accuse pas le puits d'être trop profond,
    c'est peut-être ta corde qui est trop courte

  13. #13
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par lankoande Voir le message
    Merci pour la profonde analyse. Mon exemple je l'ai juste donné pour illustrer une possibilité d'utiliser le mot clé static. C'est juste un exemple d'école , même si au fond c'est pas un "bon exemple". !
    J'étais pas sûr de l'intention, donc j'ai préféré préciser ^^
    (pour ça que j'ai précisé dans mon exemple que c'est une horreur aussi )
    Je ne suis pas mort, j'ai du travail !

  14. #14
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    << Ça ne peut pas être static, tout simplement parce qu'en static, on ne sait pas sur quel objet aller chercher la variable name. >>

    C'est ce que j'ai cherché, merci à vous tous.

    Pour l'exemple de nombre de compte, je cois qu'une base de données doit être installée à l'avance et par une requête de comptage on aura le nombre de compte

    qu'il nous faut, je cois que la meilleure utilisation de Static c'est en thread, par exemple ou aura un ensemble de processus et un drapeau global Static qui exprime

    qu'il y a par exemple une interruption : problème d'une ressource et que tous les autre processus doivent être avertis pour prendre les mesures nécessaires.

    Il y a aussi des idées brillantes pour l'utilisation de Static sinon pourquoi elle existe en JAVA ?

    Je cherche encore d'autre cas de son utilisation, merci pour vos contributions.

  15. #15
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par hagane1 Voir le message
    Bonjour,

    <, je cois que la meilleure utilisation de Static c'est en thread, par exemple ou aura un ensemble de processus et un drapeau global Static qui exprime

    qu'il y a par exemple une interruption : problème d'une ressource et que tous les autre processus doivent être avertis pour prendre les mesures nécessaires.
    ??? j'a pas compris ???
    tu peux par ex. avoir un ThreadGroup qui prévient tous les threads du groupe ....
    Il y a aussi des idées brillantes pour l'utilisation de Static sinon pourquoi elle existe en JAVA ?

    Je cherche encore d'autre cas de son utilisation, merci pour vos contributions.
    les données "static" sont initialisées au "load_time" pour un ClassLoader donné (ça peut d'ailleurs, pour les données, créer d'étrange surprises: il n'y a pas au sens strict de "variable globale" en Java).
    on peut à ce moment initialiser par exemple des ressources partagées(partagé est le mot clef) .... il y a des tas d'autres cas (données partagées, méthodes qui n'agissent pas dans le contexte d'une instance, classes liées au contexte général d'une autre classe, code de load-time)
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  16. #16
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par hagane1 Voir le message
    je cois que la meilleure utilisation de Static c'est en thread, par exemple ou aura un ensemble de processus et un drapeau global Static qui exprime qu'il y a par exemple une interruption : problème d'une ressource et que tous les autre processus doivent être avertis pour prendre les mesures nécessaires.
    Surtout pas, les éléments static ne SONT PAS thread safe ! Plusieurs threads peuvent les modifier en même temps sans aucun verrouillage !

    Il y a aussi des idées brillantes pour l'utilisation de Static sinon pourquoi elle existe en JAVA ?
    Je cherche encore d'autre cas de son utilisation, merci pour vos contributions.
    Dans le cas de définition de variables globales invariables.
    Un exemple : dans le cas d'un définition d'un logger, tu crées une instance en private static final qui sera utilisable par toutes les instances de ta classe... Et il n'y aura qu'une seule instance de logger pour toutes les instances de ta classe.

    Et pourquoi ça existe en java? Tout simplement parce que tout n'est pas forcement lié à une instance de Classe... Du genre la méthode main qui ne peut pas être lié à une quelconque instance...


    Autre avantage, ça permet de faire un bloc d'initialisation qui sera appelé une seule fois au démarrage de ton application (pour charger un fichier de propriétés de type ResourceBundle une seule fois plutôt que de le charger à chaque fois par exemple)

    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
    18
     
    public class MaClasse{
     
        static{
            // ce bloc est appelé une seule fois au démarrage de l'application
        }
     
     
        {
            // ce bloc est appelé à chaque fois que tu fais new AVANT le constructeur
        }
     
     
        public MaClasse(){
            // ce bloc est appelé à chaque fois que tu fais un new
        }
     
    }
    Je ne suis pas mort, j'ai du travail !

  17. #17
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Alors,

    pour
    Du genre la méthode main qui ne peut pas être lié à une quelconque instance...
    , est ce que tu veut dire que la méthode main n’appartient

    à aucune classe or je vois quelle est incluse dans une, probablement la classe Object.

    pour
    Autre avantage, ça permet de faire un bloc d'initialisation qui sera appelé une seule fois au démarrage de ton application (pour charger un fichier de

    propriétés de type ResourceBundle une seule fois plutôt que de le charger à chaque fois par exemple)
    , donc Static son but est d'optimiser le temps

    d’exécution et l'espace mémoire occupé par la méthode (au lieu de réserver à chaque fois un nouvel espace mémoire pour une nouvelle méthode d'un nouvel

    objet récemment crée ) si c'est bien ça, ce que j'ai dit ici
    on peut modifier l’état d'un objet avec une méthode de classe sans que ses modifications atteignent un autre objet sachant que les propriétés de la classe ne sont Static
    c’était exactement ça seulement je me suis mal exprimer les choses, je voulais dire que pourquoi à chaque création d'une nouvelle instance au lieu de réserver à

    chaque fois un espace mémoire pour sa méthode, cette méthode sera déclarer Static et comme ça on lui réserve uniquement l'espace mémoire pour la première

    fois, quant aux autre instances on a besoin de les fournir des espaces à leurs méthodes.

    Est que c'est faisable ?

    Merci.

  18. #18
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par hagane1 Voir le message
    est ce que tu veut dire que la méthode main n’appartient à aucune classe or je vois quelle est incluse dans une, probablement la classe Object.
    J'ai dit à aucune INSTANCE, pas à aucune classe !

    Le public static void main(String[] args) est le point d'entrée d'une classe qui la définit comme étant exécutable en ligne de commande. Il est donc impossible qu'elle soit lié à une instance vu que tu ne peux avoir aucune instance avant d'arriver dans ce point.


    donc Static son but est d'optimiser le temps d’exécution et l'espace mémoire occupé par la méthode (au lieu de réserver à chaque fois un nouvel espace mémoire pour une nouvelle méthode d'un nouvel objet récemment crée
    Il y a aussi des notions de design objet et de bonnes pratiques : quand on crée un modèle objet, on ne pense pas tout de suite à l'optimisation ou à l'espace mémoire.
    Il faut voir les éléments marqués en "static" comme des éléments "utilitaires" ou des outils ayant un rôle unique (principe de responsabilité) : dans l'exemple du logger, on créée une instance d'un objet Log qui sera utilisé par toutes les autres instances de cette classe.
    Il y a effectivement un gain en terme de mémoire et de temps d'exécution, mais aussi en terme d'écriture et de logique.


    pourquoi à chaque création d'une nouvelle instance au lieu de réserver à chaque fois un espace mémoire pour sa méthode, cette méthode sera déclarer Static et comme ça on lui réserve uniquement l'espace mémoire pour la première fois, quant aux autre instances on a besoin de les fournir des espaces à leurs méthodes.

    Est que c'est faisable ?
    Il n'y a pas en soit de concept de réservation de mémoire en Java. La JVM se débrouille et on la laisse faire ce qu'elle est censée faire (par contrat), elle viendra bien assez tôt nous souffler dans les bronches si on a mal fait notre travail (et qu'elle ne peut plus faire le sien du coup).

    Chaque fois que tu fais un "new MaClasse()", une zone mémoire est effectivement réservée pour la nouvelle instance avec des zones pour chaque propriété de l'instance. Tout ce qui est statique est déjà chargé bien avant de faire un new (au démarrage de l'application).

    Donc je ne sais pas ce que tu veux dire dans ta question par rapport à la réservation de mémoire et comment l'optimiser, mais utiliser ou pas des mots clés static n'est pas la bonne piste.
    Pour économiser de la place en Java, il y a plusieurs méthodes, dont celle de ne pas garder de références à des éléments dont on n'a plus besoin, limiter au maximum les références de longue durées (des objets qui maintiennent des liens vers des objets contenant des données par exemple), ne pas hésiter à découper au maximum son algorithme (tous les objets créés dans une méthode qui ne sont pas renvoyés dans un return disparaissent à la sortie de la méthode), etc...
    Je ne suis pas mort, j'ai du travail !

  19. #19
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par eulbobo Voir le message
    Le public static void main(String[] args) est le point d'entrée d'une classe qui la définit comme étant exécutable en ligne de commande. Il est donc impossible qu'elle soit lié à une instance vu que tu ne peux avoir aucune instance avant d'arriver dans ce point.
    A mon avis, ce n'est pas le meilleur exemple. main est le point d'entrée des applications par conception. Ca aurait pu etre fait autrement (par exemple par extension d'une classe comme l'applet).


    Citation Envoyé par hagane1 Voir le message
    Il y a aussi des idées brillantes pour l'utilisation de Static sinon pourquoi elle existe en JAVA ?
    Tu cherches des exemples d'utilisation de static ? En ce qui concerne les variables, je dirais que 99% de celles que j'utilise sont des static final (autrement dit des constantes). C'est donc tres utile. J'en utilise aussi de temps en temps pour des singletons.

    En ce qui concerne les méthodes, je pense à une factory (mettre les constructeurs d'une classe en private et utiliser une fonction static chargée de créer les instances), des méthodes utilitaires (Regarde du coté de la classe Collections qui en a pas mal). Bref, pas mal d'utilités

    Citation Envoyé par Diablo_22 Voir le message
    static son utilisation n'est pas préconisé
    Pas tres brillant de balancer ce genre de chose sur un forum sans aucune explication sur pourquoi ce ne serait pas préconisé... D'autant que c'est (très) largement utilisé y compris dans l'API...

  20. #20
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Je vous remercie tous pour vos réponse, vraiment c'est très génial !!!!

    Merci à vous tous.

Discussions similaires

  1. Fabrique : utilisation de static ou classe dédiée ?
    Par Evocatii dans le forum Design Patterns
    Réponses: 2
    Dernier message: 05/01/2011, 20h02
  2. Réponses: 1
    Dernier message: 23/04/2010, 10h34
  3. Utilisation de static char * dans un cas precis
    Par student_ dans le forum Débuter
    Réponses: 4
    Dernier message: 09/01/2010, 22h24
  4. [Magento] Utiliser les "static blocks" pour naviguer comme dans un site quelconque
    Par ttone dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 04/05/2009, 19h03
  5. utilisation de static avec une DLL !
    Par Mike91 dans le forum MFC
    Réponses: 5
    Dernier message: 10/01/2008, 12h54

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