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 :

Appel d'un attribut statique dans la classe courante


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 92
    Par défaut Appel d'un attribut statique dans la classe courante
    Bonjour !

    Voici un exemple de classe JAVA avec appel à un attribut statique en son sein :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Compteur {
        static private int cpt;
        ...
         public int combien() {
            return cpt;
        }
    }
    En PHP, on peut utiliser le mot clé self pour préciser que l'on appelle l'attribut de la classe courante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Compteur {
        private static $cpt;
        ...
        public function combien() {
            return self::$cpt;
        }
    }
    Existe t'il une méthode analogue en JAVA ??

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Pour être certain d'appeler _ce_ cpt-là, il faut écrire le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Compteur {
        static private int cpt;
        ...
         public int combien() {
            return Compteur.cpt;
        }
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    Hello,

    il faut savoir qu'un attribut statique est un attribut de classe.
    Il y a donc zéro ou une seule valeur pour cet attribut au sein d'une JVM.

    S'il est privé, tu ne sais l'appeler que de la classe "courante".

    Je ne comprends d'ailleurs pas ce que tu veux dire par "classe courante", a moins que tu ne veuille dire "instance courante", ce qui est une faute vu que nous sommes dans un contexte statique.

    Voila, comment accèder à la valeur statique partout dans ton appli.

    int cpt = Compteur.combien();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Compteur {
         private static int cpt;
        ...
         public static int combien() {
            return cpt;
        }
    }

  4. #4
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 92
    Par défaut
    Effectivement. On peut également le faire en PHP.

    En fait, je voudrais savoir quelle est la meilleure pratique (au sens académique du terme) entre
    et
    Venant du monde PHP, je trouve cette dernière un peu "crade".
    Y'a t'il une notion qui m'échappe en JAVA?

  5. #5
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 92
    Par défaut
    Merci pour ta réponse Yannick1717. Je suis tout à fait d'accord avec toi.

    Je parle de classe courante pour évoquer la possibilité que cette classe soit étendue et donc la possibilité de retrouver un attribut de même nom dans une classe supérieure.

    Pour l'exemple, j'aurais dû mettre l'attribut en publique, désolé.

  6. #6
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Salut,

    Un attribut static est un attribut qui est le même pour n'importe quelle instance de la classe. Il n'a donc pas besoin d'une instance de classe pour être appelé.

    Dans ton exemple, cpt est bien un membre de n'importe quelle instance d'une classe. A l'intérieur d'une instance de ta classe, cpt existe.

    Il faut aussi savoir que si tu change la valeur de cpt dans une instance, sa valeur est changée dans n'importe quelle autre instance . Exécute ce code pour t'en convaincre :

    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
    19
    20
    21
    22
    23
    24
    public class Test
    {
        private static int cpt=0;
     
        int combien()
        {
    	return this.cpt;
        }
     
        void setCpt(int n)
        {
    	cpt=n;
        }
     
        public static void main(String[] args)
        {
    	Test t1=new Test();
    	Test t2=new Test();
     
    	System.out.println(t1.combien());
    	t2.setCpt(5); // on change cpt dans l'instance t2
    	System.out.println(t1.combien()); // il est changé aussi dans l'instance t1
        }
    }
    Conclusion :
    Il n'y a aucune différence entre retourner cpt, this.cpt ou Compteur.cpt.

    Le problème se pose quand tu essaie d'accéder à des choses non statiques dans un contexte statique

    F.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    Ah oui, ton problème était en fait à la manière d'y accéder, je n'avais pas saisi exactement...

    pitit exemple, tu remarquera que je fais appel à l'attribut du même nom de la classe parente.
    Si tu dois l'interdire, tu met le cpt de la classe parente en private, et jamais il n'y aura de confusion.
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    public class TestA 
    { 
        protected static int cpt = 1;
     
        public static void print(){
            System.out.println(cpt);
        }
    } 
     
    public class TestB extends TestA
    { 
        private static int cpt = 5;
     
        public static void print(){
            System.out.println(cpt);
        }
     
        public static void printA(){
            System.out.println(Testa.cpt);
        }
    } 
     
    public static void main(String[] args){
            TestA.print();
            TestB.print();   
            TestB.printA();
    }

  8. #8
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 92
    Par défaut
    Citation Envoyé par mavina Voir le message
    Il n'y a aucune différence entre retourner cpt, this.cpt ou Compteur.cpt.
    Manvina, faire un this.cpt pour accéder à un champ statique, pour le coup, c'est vraiment super "crade" non!!?


    Yannick1717, ton exmple illustre bien ce que j'avais en tête. Il faut donc être extrêmement prudent en JAVA quant à l'utilisation des attributs statiques. Perso, je trouve cette manière implicite d'accéder assez "confusante". Mais cela ne reste que mon avis..


    En PHP, l'appel implice ne fonctionne pas et une notice est levée :

    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
    19
    20
    21
    22
    23
    24
     
    <?php
    error_reporting(E_ALL);
    class Test {
     
      public static $var;
     
      public function Test() {
        self::$var = 10;
      }
     
      public function getVar1() {
        return $var;  
      }
     
      public function getVar2() {
        return self::$var;  
      }
    }
     
    $test = new Test();
    print(" getVar1() -> ".$test->getVar1()."<br>");
    print(" getVar2() -> ".$test->getVar2()."<br>");
    ?>
    Voilà ce que l'on obtient :
    Notice: Undefined variable: var in C:\applications\wamp\www\test\test.php on line 12
    getVar1() ->
    getVar2() -> 10

  9. #9
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Je n'ai pas dit que c'était "propre", mais qu'il n'y avait aucune différence. Conceptuellement parlant, tu accède au même cpt...

    C'est comme ça en java, c'est tout Même si en PHP c'est fait d'une autre manière

    F.

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Citation Envoyé par picwic Voir le message
    Manvina, faire un this.cpt pour accéder à un champ statique, pour le coup, c'est vraiment super "crade" non!!?
    Il est assez rare de manimuler les attributs statiques, dans de nombreux cas on préfèrera utiliser une seule instance d'un objet (Singleton).

    Quant aux constantes, la norme est de les nommer en majuscules donc on peut les identifier facilement.

    Après chaque language a ses spécificités, c'est juste une question d'habitude...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. changer l'attribut etat dans une class
    Par amen_1919 dans le forum W4 Express
    Réponses: 16
    Dernier message: 07/05/2008, 13h03
  2. Réponses: 4
    Dernier message: 16/03/2008, 18h06
  3. [Tableaux] Probleme variable statique dans une classe
    Par Joe Le Mort dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2006, 11h35
  4. Créer une liste d'objets statiques dans une classe
    Par crossbowman dans le forum C++
    Réponses: 3
    Dernier message: 13/03/2006, 09h11
  5. membre statique dans une classe
    Par motrin dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 30/12/2005, 15h15

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