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

person Hanno Fietz    schedule 19.03.2009    source источник
comment
Я не уверен, что полностью понимаю, что вы пытаетесь описать. можешь ли ты дать небольшой образец кода?   -  person Pete    schedule 19.03.2009


Ответы (2)


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

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

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

person Jon Skeet    schedule 19.03.2009

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

например если у тебя есть

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

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

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

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

person Steve B.    schedule 19.03.2009