2009-03-19 13 views
106

Je n'arrive pas à accéder aux instances d'instance de la classe environnante depuis l'intérieur d'une énumération, comme je le pouvais depuis une classe interne. Est-ce que cela signifie que les enums sont statiques? Y a-t-il un accès à la portée de l'instance de la classe environnante, ou dois-je passer l'instance dans la méthode d'enum où j'en ai besoin?En Java, les types enum sont-ils dans une classe statique?

public class Universe { 
    public final int theAnswer; 

    public enum Planet { 
     // ... 
     EARTH(...); 
     // ... 

     // ... constructor etc. 

     public int deepThought() { 
      // -> "No enclosing instance of type 'Universe' is accessible in this scope" 
      return Universe.this.theAnswer; 
     } 
    } 

    public Universe(int locallyUniversalAnswer) { 
     this.theAnswer = locallyUniversalAnswer; 
    } 
} 
+0

Je ne suis pas sûr de comprendre totalement ce que vous essayez de décrire. pouvez-vous donner un petit échantillon de code peut-être? – Pete

Répondre

160

Oui, les énumérations imbriquées sont implicitement statiques.

De l'language specification section 8.9:

types emboîtés ENUM implicitement statique. Il est permis à de déclarer explicitement un type d'enum imbriqué pour être statique.

44

Il ne serait pas logique de faire une instance de niveau (non statique) classe ENUM intérieure - si les instances de ENUM eux-mêmes étaient liés à la classe externe, ils brisaient la garantie ENUM -

par exemple si vous aviez

public class Foo { 
    private enum Bar { 
     A, B, C; 
    } 
} 

Pour les valeurs ENUM pour agir correctement en tant que constantes, (psuedocode, sans tenir compte des restrictions d'accès)

Bar b1 = new Foo().A 
Bar b2 = new Foo().A 

b1 et b2 devraient être les mêmes objets.