Подтвердить что ты не робот

В Java, перечислены типы внутри статического класса?

Я не могу получить доступ к членам экземпляра окружающего класса изнутри перечисления, как мог, изнутри внутреннего класса. Означает ли это, что перечисления являются статическими? Есть ли доступ к объему экземпляра окружающего класса, или мне нужно передать экземпляр в метод перечисления, где он мне нужен?

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

Ответ 1

Да, вложенные перечисления неявно статичны.

Из раздела языка 8.9:

Вложенные типы перечислений неявно статичный. Допустимо явно объявить вложенный тип перечисления быть статичным.

Ответ 2

Не было бы смысла создавать внутренний класс 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 должны быть одинаковыми объектами.