En Java, ¿los tipos de enumeración dentro de una clase son estáticos?

123

Parece que no puedo acceder a los miembros de 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 la necesito?

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;
    }
}
Hanno Fietz
fuente
No estoy seguro de entender totalmente lo que estás tratando de describir. ¿Puedes dar una pequeña muestra de código quizás?
Pete

Respuestas:

176

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

De la sección de especificación de lenguaje 8.9 :

Los tipos de enumeración anidados son implícitamente estáticos. Es permisible declarar explícitamente un tipo de enumeración anidado como estático.

Jon Skeet
fuente
45

No tendría sentido crear una clase de enumeración interna (no estática) a nivel de instancia; si las instancias de enumeración estuvieran vinculadas a la clase externa, romperían la garantía de enumeración.

por ejemplo, si tuvieras

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

Para que los valores de enumeración actúen correctamente como constantes (psuedocode, ignorando las restricciones de acceso)

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

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

Steve B.
fuente