带有常量的java枚举非法前向引用

时间:2016-05-31 20:21:29

标签: java enums constants

我有以下简单的枚举,我想声明并使用一些常量(作为构造函数参数):

public enum MyEnum {

    A(FOO), B(BAR);

    MyEnum(String foo) {
    }

    static final String FOO = "foo";
    static final String BAR = "bar";
}

但是,编译器给出了以下错误:

Error:(3, 7) java: illegal forward reference
Error:(3, 15) java: illegal forward reference

如果我尝试在像Intellij IDEA这样的IDE中重构原始枚举,它会将构造函数参数提取到内部类的常量中,并且以下代码编译好了:

SNIPPET 1

public enum MyEnum {

    A(Constants.FOO), B(Constants.BAR);

    MyEnum(String foo) {
    }

    private static class Constants {
        public static final String FOO = "foo";
        public static final String BAR = "bar";
    }
}

我还发现即使没有内部常量类,如果使用完全分类的名称指定常量,代码也会编译好:

SNIPPET 2

public enum MyEnum {

    A(MyEnum.FOO), B(MyEnum.BAR);

    MyEnum(String foo) {
    }

    static final String FOO = "foo";
    static final String BAR = "bar";
}

问题:

  1. 有人可以解释为什么代码片段2中的代码编译而原始代码却没有编译?这是一些链接问题吗?

  2. 在片段1和2的解决方案之间进行选择时,哪种方法更好(更干净)?对我来说,代码片段1(带有常量的内部类)看起来更干净,但我担心内部类的额外成本:在这种情况下,应用程序+20内部类中将有20个枚举。

  3. 谢谢!

0 个答案:

没有答案