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;
}
}
Odpowiedzi:
Tak, zagnieżdżone wyliczenia są niejawnie statyczne.
Ze specyfikacji języka w sekcji 8.9 :
źródło
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ł
Aby wartości wyliczenia poprawnie działały jako stałe (psuedocode, ignorowanie ograniczeń dostępu)
b1 i b2 musiałyby być tymi samymi obiektami.
źródło