我的情况:
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
答案 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()
枚举值进行更简单的比较