В Java типы enum внутри класса статичны? - PullRequest
115 голосов
/ 19 марта 2009

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

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

Ответы [ 2 ]

169 голосов
/ 19 марта 2009

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

Из раздела спецификации языка 8.9 :

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

46 голосов
/ 19 марта 2009

Не имеет смысла создавать внутренний (не статический) класс перечисления на уровне экземпляра - если экземпляры перечисления сами связаны с внешним классом, они нарушают гарантию перечисления -

например. если бы у вас было

public class Foo {
   private enum Bar {
        A, B, C;
   } 
}

Чтобы значения перечисления действовали как константы (psuedocode, игнорируя ограничения доступа)

Bar b1 = new Foo().A
Bar b2 = new Foo().A

b1 и b2 должны быть одинаковыми объектами.

...