【发布时间】:2018-03-26 09:39:20
【问题描述】:
下面是我正在试验的代码:
public enum PagesEnum {
PAGE1 {
public static final SectionsEnum SECTION_A = SectionsEnum.SECTION_A;
public static final SectionsEnum SECTION_B = SectionsEnum.SECTION_B;
},
PAGE2 {
public static final SectionsEnum SECTION_C = SectionsEnum.SECTION_C;
public static final SectionsEnum SECTION_D = SectionsEnum.SECTION_D;
}
}
public enum SectionsEnum {
SECTION_A,
SECTION_B,
SECTION_C,
SECTION_D
}
(实验的目标是得到类似PAGE1.SECTION_A的语法,但这不是本题的重点。)
我在 Eclipse 中收到以下编译器错误:
字段
SECTION_A不能在非静态内部类型中声明为静态,除非用常量表达式初始化
现在我有点困惑。 SECTION_A 使用枚举 SectionsEnum.SECTION_A 初始化 - 为什么枚举不是常量表达式?我检查了 JLS,枚举确实没有在Constant Expressions 中收听。
我想知道,为什么会这样。
【问题讨论】:
-
PagesEnum子类型由PAGE1{}创建是静态的吗?也许这就是给你带来麻烦的部分:“......在非静态内部类型......”。 -
@MalteHartwig 我同意
PAGE1{}被视为“非静态内部类型”。但我不明白为什么枚举值不是“常量表达式”。从我的角度来看,Java 中没有什么比枚举值更稳定的了。 -
是的,既然你这样重复......但无论如何,我认为它不会像你所想的那样工作:
SECTION_X将是@987654331 的匿名子类的常量@。因此,您永远无法访问它们,因为缺少作为前缀的类名。如果我删除了静态修饰符,Eclipse 会给我这个警告:“字段 new MyClass.PagesEnum(){}.SECTION_A 的值未使用”。那是定义常量的类...您无法访问,因为它是匿名的。 -
@watchme 好吧,“常量变量”实际上列在“常量表达式”中。
-
@MalteHartwig 你是对的,这个实验很可能会失败。我对此很好,但这不在我的问题范围内。