Czy w Javie typy wyliczeniowe są wewnątrz klasy statyczne?

123

Wydaje się, że nie mogę uzyskać dostępu do członków instancji z otaczającej klasy z wnętrza wyliczenia, tak jak w przypadku wewnętrznej klasy. Czy to oznacza, że ​​wyliczenia są statyczne? Czy istnieje dostęp do zakresu wystąpienia otaczającej klasy, czy też muszę przekazać wystąpienie do metody wyliczenia, gdzie jest to potrzebne?

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
źródło
Nie jestem pewien, czy całkowicie rozumiem, co próbujesz opisać. czy możesz podać małą próbkę kodu?
Pete

Odpowiedzi:

176

Tak, zagnieżdżone wyliczenia są niejawnie statyczne.

Ze specyfikacji języka w sekcji 8.9 :

Zagnieżdżone typy wyliczeniowe są niejawnie statyczne. Dopuszczalne jest jawne zadeklarowanie zagnieżdżonego typu wyliczeniowego jako statycznego.

Jon Skeet
źródło
45

Nie miałoby sensu tworzenie wewnętrznej klasy wyliczeniowej na poziomie instancji (niestatycznej) - gdyby instancje wyliczenia były same powiązane z klasą zewnętrzną, złamałyby gwarancję wyliczenia -

np. gdybyś miał

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

Aby wartości wyliczenia poprawnie działały jako stałe (psuedocode, ignorowanie ograniczeń dostępu)

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

b1 i b2 musiałyby być tymi samymi obiektami.

Steve B.
źródło