Em Java, os tipos de enumeração dentro de uma classe são estáticos?

123

Parece que não consigo acessar membros de instância da classe circundante de dentro de uma enumeração, como eu poderia de dentro de uma classe interna. Isso significa que as enumerações são estáticas? Existe algum acesso ao escopo da instância da classe circundante ou preciso passar a instância para o método da enumeração em que eu preciso?

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
fonte
Não sei se entendi totalmente o que você está tentando descrever. você pode dar um pequeno exemplo de código, talvez?
Pete

Respostas:

176

Sim, enumerações aninhadas são implicitamente estáticas.

Na seção de especificação de idioma 8.9 :

Os tipos de enumeração aninhados são implicitamente estáticos. É permitido declarar explicitamente um tipo de enum aninhado como estático.

Jon Skeet
fonte
45

Não faria sentido criar uma classe enum interna (não estática) no nível da instância - se as instâncias enum estivessem ligadas à classe externa, elas quebrariam a garantia enum -

por exemplo, se você tivesse

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

Para que os valores de enumeração atuem corretamente como constantes (psuedocode, ignorando restrições de acesso)

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

b1 e b2 teriam que ser os mesmos objetos.

Steve B.
fonte