2009-03-19 8 views
106

Parece que no puedo acceder a los miembros de la instancia de la clase circundante desde dentro de una enumeración, como pude desde dentro de una clase interna. ¿Eso significa que las enumeraciones son estáticas? ¿Hay algún acceso al alcance de la instancia de la clase circundante, o tengo que pasar la instancia al método de la enumeración donde lo necesito?En Java, ¿los tipos enum dentro de una clase son estáticos?

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

No estoy seguro de entender completamente lo que intentas describir. ¿Puedes dar una pequeña muestra de código quizás? – Pete

Respuesta

160

Sí, las enumeraciones anidadas son implícitamente estáticas.

Desde el language specification section 8.9:

tipos de enumeración anidados son implícitamente estática. Está permitido declarar explícitamente que un tipo de enumeración enum es estático.

44

No tendría sentido hacer una a nivel de instancia (no estático) clase de enumeración interior - si las instancias de enumeración se vieron atados a la clase externa que rompería la garantía de enumeración -

p.ej si tuviera

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

Para los valores de enumeración para actuar adecuadamente como constantes, (psuedocode, haciendo caso omiso de las restricciones de acceso)

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

b1 y b2 tendrían que ser los mismos objetos.

Cuestiones relacionadas