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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 10
    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 éclairé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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
    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é.

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

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

    Informations forums :
    Inscription : Août 2014
    Messages : 194
    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 Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    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)

  5. #5
    Membre éclairé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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
    Par défaut
    static son utilisation n'est pas préconisé

  6. #6
    Membre très actif 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 : 31
    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
    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é..

  7. #7
    Membre chevronné

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

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

    Informations forums :
    Inscription : Août 2014
    Messages : 262
    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.

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

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    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)

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 10
    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 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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 Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    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.

  12. #12
    Membre chevronné

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

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

    Informations forums :
    Inscription : Août 2014
    Messages : 262
    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". !

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

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    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 )

  14. #14
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 10
    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.

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