2016-07-18 3 views
-1

J'ai une classe locale déclarée dans une méthode, dont les champs sont déclarés comme étant privés. Cependant, je suis toujours en mesure d'y accéder directement à partir du corps de la méthode englobante - pourquoi est-ce?Modificateurs de contrôle d'accès dans les classes locales - pourquoi ne fonctionnent-ils pas?

En note secondaire, j'ai déclaré que tous les champs d'une classe anonyme étaient privés, mais y a-t-il réellement un avantage à le faire? Est-ce que quelque chose pourrait y accéder?

Edit: exemple de code

public void myMethod() { 

    class myException extends SomeOtherException{ 
     private boolean Bool; 

     public Boolean getBool() { return this.Bool; } 

     public myException() { //constructor stuff } 
    } 

    try { 
     Thing.setHandler(new HandlingClass() { 
      private String myString; //What is the point in making these private? 

      ... other methods in anonymous class ... 
     } 
    ... more code ... 
    } catch (myException e) { 
     ... e.Bool //Can be accessed. Why? 
    } 
} 
+0

S'il vous plaît ajouter du code. – Fildor

+0

Faire 'myString' ** private ne sert à rien **; le comportement de la réflexion est légèrement différent (si un SecurityManager est installé). Rappelez-vous que vous pouvez faire 'new HandlingClass() {...} .myString' –

Répondre

0

La raison pour laquelle il est accessible est parce qu'il est accessible de manière similaire aux classes emboîtées. Selon votre méthode, les attributs de la classe locale sont visibles, cela aurait été la même chose s'il s'agissait d'une classe imbriquée.

Voici un fragment de documentation java sur les classes locales:

Accès aux membres d'une classe Enclosing

Une classe locale a accès aux membres de sa classe englobante.

En outre, une classe locale a accès aux variables locales. Cependant, une classe locale peut uniquement accéder aux variables locales déclarées définitives. Lorsqu'une classe locale accède à une variable locale ou à un paramètre du bloc englobant , elle capture cette variable ou ce paramètre. Par exemple, le constructeur PhoneNumber peut accéder à la variable locale numberLength car il est déclaré final; numberLength est une variable capturée.

Cependant, à partir de Java SE 8, une classe locale peut accéder aux variables locales et les paramètres du bloc englobante qui sont définitives ou efficacement final. Une variable ou un paramètre dont la valeur n'est jamais modifiée après son initialisation est effectivement final.

https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html