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;
    }
}

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.