为什么我不能在构造函数中访问枚举中的静态字段?

时间:2012-12-14 04:51:43

标签: java

  

可能重复:
  Cannot access static field within enum initialiser

我的情况:

enum Attribute { POSITIVE, NEGATIVE }
enum Content {
    C1(Attribute.POSITIVE),
    C2(Attribute.POSITIVE),
    ... // some other positive enum instances.
    Cm(Attribute.NEGATIVE),
    ... // some other negative enum instances.
    Cn(Attribute.NEGATIVE);

    private final Atrribute a;
    static int negativeOffset = 0;
    private Content(Atrribute a) {
        this.a = a;
        if ( a.compareTo(Attribute.POSITIVE) == 0 ) {
               negativeOffset ++;
        }
    }

    public static int getNegativeOffset() { return negativeOffset; }
} 

我的意图是每当我添加一个新的枚举(带有POSITIVE属性)时将negativeOffset加一,然后我可以调用getNegativeOffset()来得到负的起始点 enum并做任何我想做的事。

但是,路易斯抱怨说

Cannot refer to the static enum field Content.negativeOffset within an initializer

1 个答案:

答案 0 :(得分:2)

您可以使用此"技巧":

private static class IntHolder {
    static int negativeOffset;
}

然后引用这样的变量:

IntHolder.negativeOffset ++;

return IntHolder.negativeOffset; 

这样做的原因是JVM保证在IntHolder静态内部类初始化时初始化变量,这在它被访问之前不会发生。

整个班级将如下,编译:

enum Attribute { POSITIVE, NEGATIVE }
enum Content {
    C1(Attribute.POSITIVE),
    C2(Attribute.POSITIVE),
    ... // some other positive enum instances.
    Cm(Attribute.NEGATIVE),
    ... // some other negative enum instances.
    Cn(Attribute.NEGATIVE);

    private final Attribute a;

    private static class IntHolder {
        static int negativeOffset;
    }

    private Content(Attribute a) {
        this.a = a;
        if ( a == Attribute.POSITIVE) {
               IntHolder.negativeOffset ++;
        }
    }

    public static int getNegativeOffset() { return IntHolder.negativeOffset; }
}

请注意拼写错误的更正以及使用Attribute代替==

compareTo()枚举值进行更简单的比较