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 :

Précision sur la portée des variables en Java


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 23
    Points : 14
    Points
    14
    Par défaut Précision sur la portée des variables en Java
    Bonjour à tous,

    Tout d'abord, veuillez m'excuser, je me doute que ma question a déjà une réponse que je pourrais trouver via Google, mais ne connaissant pas les termes précis qui concernent ma question, c'est assez compliqué de faire une recherche. Et lorsque je consulte des articles parlant de la portée des variables, je ne trouve pas la précision recherchée.

    Je vais donc tenter de m'exprimer correctement à ce sujet. Un bout de code devrait m'aider à me faire comprendre:

    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
     
    public class Test
    {
       protected boolean myBoolean = true;
     
       Test()
       {
          Foo mFoo = new Foo() {
             @Override
             public void action()
             {
                myBoolean = false;
             }
          };
        }
    }
    Voilà, ma question est maintenant toute simple: est-ce que j'ai le droit de faire ça ? Ai-je le droit d'accéder aux variables de ma classe Test depuis la méthode redéfinie de Foo ?

    Si oui, est-ce que le fait que la variable soit public, protected ou private y change quelque chose ? Est-ce une bonne façon de faire ou est-ce à éviter ?

    Mes tests me montrent que ça compile en tout cas, mais je trouve cela assez bizarre puisque la méthode "action" est une méthode de la classe Foo et qu'elle accède directement à la variable de Test...


    Merci d'avance pour votre réponse

  2. #2
    Membre confirmé
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Points : 559
    Points
    559
    Par défaut
    Bonjour,
    L'un des intérêts de l'innerClass est qu'elle ait accès aux membres de la classe à l'intérieur de laquelle elle est définie.
    Cet accès est légitime, puisque l'innerClass va permettre de définir un membre (et est un membre) de l'outerClass.

    myBoolean=false dans la méthode action fait référence plus explicitement à Test.this.myBoolean = false

    S'il y avait eu ambiguïté de nommage, tu aurais du faire cette précision :

    Ne modifie pas le myBoolean de la classe Test, mais le paramètre passé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @Override
    public void action(boolean myBoolean) {
    	myBoolean = false;
    	...
    }
    Modifie le myBoolean de la classe Test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @Override
    public void action(boolean myBoolean) {
    	Test.this.myBoolean = false;
    	...
    }
    Sur Google, tu peux rechercher : inner class accessing outer class members

  3. #3
    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
    Citation Envoyé par romit Voir le message
    Si oui, est-ce que le fait que la variable soit public, protected ou private y change quelque chose ?
    Non.

    Citation Envoyé par romit Voir le message
    Est-ce une bonne façon de faire ou est-ce à éviter ?
    Les classes anonymes, comme ton extension de Foo, ont quelques défauts de clarté dans le code. Elles sont moins faciles à comprendre, quoi. Mais parfois, elles restent plus claires que si on avait fait autrement.
    Ça dépend des cas, mais je t'invite à te demander si tu voudrais pas plutôt faire une classe imbriquée au lieu d'une classe anonyme.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    D'accord, merci pour vos réponses.

    En me renseignant un peu (maintenant que je connais le terme exact), j'ai trouvé des sites qui disent qu'une classe anonyme ne peut accéder qu'aux attributs "final". Est-ce moi qui comprend mal ?


    Moi je cherche à savoir si la classe anonyme peut effectivement accéder à tous les attributs et les modifier directement (et donc pas une copie !)

  5. #5
    Membre confirmé
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Points : 559
    Points
    559
    Par défaut
    Bonjour,
    j'ai un peu fait l’amalgame entre innerClass et classe anonyme dans ma réponse, mais la classe anonyme est un cas particulier d'innerClass, et l'accès aux membres de la classe conteneur est le même dans les 2 cas : en faisant appel à myBoolean dans la méthode action de ta classe anonyme, tu fais bien une référence au membre privé myBoolean, et tu agis directement sur le membre, et pas sur une copie.

    L'attribut final dont tu parles ne concerne que le cas des variables locales utilisées dans une classe anonyme :

    Exemple :
    Le code suivant ne va pas compiler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public Foo uneMethode() {
    	String varLocale = "je suis locale";//Erreur de compilation
    	Foo mFoo = new Foo() {
    		@Override
    		public void action() {
    			System.out.println(varLocale);
    		}
    	};
    	return mFoo;
    }
    parce que la méthode action de mFoo fait référence à une variable locale varLocale, qui ne sera plus accessible et aura été détruite, lorsqu'aura lieu l'appel de la méthode action() sur l'instance de Foo.
    La solution est alors de déclarer varLocale non modifiable après son initialisation (final), de façon à ce que sa valeur (connue) soit utilisée dans la méthode action (à la place de sa référence).

    On mettra donc pour une var locale :

    final String varLocale = "je suis locale";
    mais pas pour les membres de l'objet conteneur (dont on conserve la référence)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    D'accord, merci beaucoup

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

Discussions similaires

  1. [Unity 5] Question sur la portée des variables entre scènes
    Par eliniel dans le forum Unity
    Réponses: 6
    Dernier message: 16/05/2015, 10h01
  2. petite question bete sur : La portée des variables
    Par Guillaume_PRG dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 10/06/2012, 15h46
  3. Portée des variables vbscript vers ASP
    Par Immobilis dans le forum ASP
    Réponses: 3
    Dernier message: 03/11/2004, 10h14
  4. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34
  5. [Portée] portée des variables
    Par parksto dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2004, 21h05

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