Java枚举值字段无法在定义之外访问

时间:2019-03-28 08:35:23

标签: java enums

在以下代码中,无法在枚举定义之外访问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

令人反感的行会引发以下编译器错误:

{{1}}

有人知道为什么这行不通吗?我认为Java标准禁止这样做,但是为什么呢?

2 个答案:

答案 0 :(得分:1)

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
}

此处,REDGREENBLUE的类型均为Colours,而对于hexhex2f,这就是为什么您的代码无法编译的原因。

您可以做的是在枚举定义中移动它们:

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();

答案 1 :(得分:1)

根据JLS §8.9.1. Enum Constantsenum常量主体受适用于匿名类的规则约束,该规则限制了字段和方法的可访问性:

  

枚举常量的可选类主体隐式定义了一个匿名类声明(第15.9.5节),该声明扩展了立即封闭的枚举类型。类主体受匿名类的通常规则约束;特别是它不能包含任何构造函数。这些类主体中声明的实例方法只有在覆盖枚举类型(第8.4.8节)中的可访问方法时,才可以在枚举类型之外调用。