Поля значений перечисления Java недоступны вне определения - PullRequest
1 голос
/ 28 марта 2019

В следующем коде поля-члены значения Colours enum GREEN недоступны вне определения перечисления:

public class Test {

    enum Colours {
        RED,
        GREEN {
            public static final int hex = 0x00ff00;
            public final int hex2 = 0x00ff00;  // Try it without static, just in case...

            void f() {
                System.out.println(hex);    // OK
                System.out.println(hex2);   // OK
            }
        },
        BLUE
    }

    public static void main(String[] args) {
        System.out.println(Colours.GREEN.hex);      // COMPILE ERROR
        System.out.println(Colours.GREEN.hex2);     // COMPILE ERROR
    }
}

В ошибочных строках возникает следующая ошибка компилятора:

Error:(38, 41) java: cannot find symbol
  symbol:   variable hex
  location: variable GREEN of type Test.Colours

Есть идеи, почему это не работает? Я предполагаю, что стандарт Java запрещает это, но почему?

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Согласно JLS § 8.9.1.Константы перечисления тело константы enum регулируется правилами, применимыми к анонимному классу, которые ограничивают доступность полей и методов:

Необязательное тело класса константы перечисления неявно определяетобъявление анонимного класса (§15.9.5), которое расширяет непосредственно включающий тип enum.Тело класса регулируется обычными правилами анонимных классов;в частности, он не может содержать конструкторов.Методы экземпляра, объявленные в этих телах класса, могут вызываться вне типа enum-объекта, только если они переопределяют доступные методы в типе enum-объекта (§8.4.8).

1 голос
/ 28 марта 2019
enum Colours {
    RED,
    GREEN {
        public static final int hex = 0x00ff00;
        public final int hex2 = 0x00ff00;  // Try it without static, just in case...

        void f() {
            System.out.println(hex);    // OK
            System.out.println(hex2);   // OK
        }
    },
    BLUE
}

Здесь и RED, GREEN и BLUE имеют тип Colours, который не знает о hex, hex2 или f, поэтому ваш код не компилируется .

Что вы можете сделать, это переместить их в определение enum:

enum Colours {
    RED(0xff0000, 0xff0000),
    GREEN(0x00ff00, 0x00ff00),
    BLUE(0x0000ff, 0x0000ff);

    final int hex;
    final int hex2; 

    Colours(int hex, int hex2) {
        this.hex = hex;
        this.hex2 = hex2;
    }

    void f() {
        System.out.println(hex);    // OK
        System.out.println(hex2);   // OK
    }
}

Таким образом, все это будет компилироваться:

System.out.println(Colours.GREEN.hex);
System.out.println(Colours.GREEN.hex2);
Colours.GREEN.f();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...