Ответ 1
Да, вложенные перечисления неявно статичны.
Из раздела языка 8.9:
Вложенные типы перечислений неявно статичный. Допустимо явно объявить вложенный тип перечисления быть статичным.
Я не могу получить доступ к членам экземпляра окружающего класса изнутри перечисления, как мог, изнутри внутреннего класса. Означает ли это, что перечисления являются статическими? Есть ли доступ к объему экземпляра окружающего класса, или мне нужно передать экземпляр в метод перечисления, где он мне нужен?
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:
Вложенные типы перечислений неявно статичный. Допустимо явно объявить вложенный тип перечисления быть статичным.
Не было бы смысла создавать внутренний класс enum на уровне экземпляра (нестатический) - если экземпляры enum сами были привязаны к внешнему классу, они нарушили бы гарантию enum -
например. если у вас
public class Foo {
private enum Bar {
A, B, C;
}
}
Для значений enum правильно действовать как константы (psuedocode, игнорируя ограничения доступа)
Bar b1 = new Foo().A
Bar b2 = new Foo().A
b1 и b2 должны быть одинаковыми объектами.