Кажется, я не могу получить доступ к членам экземпляра окружающего класса изнутри перечисления, как я мог бы изнутри внутреннего класса. Означает ли это, что перечисления статичны? Есть ли доступ к области видимости экземпляра окружающего класса, или мне нужно передать экземпляр в метод перечисления там, где он мне нужен?
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;
}
}
Ответы:
Да, вложенные перечисления неявно статичны.
Из раздела спецификации языка 8.9 :
источник
Было бы бессмысленно создавать внутренний класс перечисления (нестатический) на уровне экземпляра - если бы экземпляры перечисления сами были привязаны к внешнему классу, они нарушили бы гарантию перечисления -
например, если бы у вас был
Чтобы значения перечисления правильно действовали как константы (псевдокод, игнорирование ограничений доступа)
b1 и b2 должны быть одними и теми же объектами.
источник