在以下代码中,无法在枚举定义之外访问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标准禁止这样做,但是为什么呢?
答案 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
}
此处,RED
,GREEN
和BLUE
的类型均为Colours
,而对于hex
,hex2
或f
,这就是为什么您的代码无法编译的原因。
您可以做的是在枚举定义中移动它们:
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 Constants,enum
常量主体受适用于匿名类的规则约束,该规则限制了字段和方法的可访问性:
枚举常量的可选类主体隐式定义了一个匿名类声明(第15.9.5节),该声明扩展了立即封闭的枚举类型。类主体受匿名类的通常规则约束;特别是它不能包含任何构造函数。这些类主体中声明的实例方法只有在覆盖枚举类型(第8.4.8节)中的可访问方法时,才可以在枚举类型之外调用。