我有一个枚举,并希望在构造函数中使用静态值作为参数。
public enum Enum
{
e1(0),
e2(1),
e3(SPECIAL_VALUE);
static int SPECIAL_VALUE = -1;
int value;
private Enum(int value)
{
this.value = value;
}
}
在此示例中,SPECIAL_VALUE
在初始化之前被访问,因此这显然不起作用。我想知道是否有一个共同的解决方案。或者我不应该这样做的原因。
注意:某处可能有重复,但我能找到的一切都与在构造函数体中使用静态字段有关,而不是作为参数,我不认为这里提出的解决方案是适用的。
答案 0 :(得分:4)
package test;
public enum Enum
{
e1(0),
e2(1),
e3(SPECIAL_VALUE());
static int SPECIAL_VALUE(){return -1;}
int value;
private Enum(int value)
{
this.value = value;
}
public int getValue()
{
return value;
}
public static void main(String args[])
{
System.out.println(e3.name());
System.out.println(e3.getValue());
}
}
第一次尝试了意识,瞧! http://ideone.com/Bz1N69
答案 1 :(得分:2)
您可以在与Enum
相同的文件中声明包本地类,并在其中声明常量。这将允许您在Enum
声明中引用常量。
public enum Enum
{
e1(0),
e2(1),
e3(EnumConstants.SPECIAL_VALUE);
int value;
private Enum(int value)
{
this.value = value;
}
}
class EnumConstants
{
static final int SPECIAL_VALUE = -1;
}
答案 2 :(得分:1)
你可以反过来 - 用文字值初始化e3
,并通过public static
字段揭示它是特殊的事实:
public enum Enum
{
e1(0),
e2(1),
e3(-1);
public static int SPECIAL_VALUE = e3.value;
int value;
private Enum(int value)
{
this.value = value;
}
}
答案 3 :(得分:0)
枚举本身就是静态决赛,所以你可以这样做:
public enum Enum {
e1(0),
e2(1),
SPECIAL_VALUE(-1),
//use the value reference
e3(SPECIAL_VALUE.getValue());
int value;
private Enum(int value)
{
this.value = value;
}
public int getValue() {
return value;
}
}
答案 4 :(得分:0)
另一种方法是将value
的初始化移动到静态初始化块,它将放在SPECIAL_VALUE
之后。
public enum Enum {
e1, e2, e3;
static int SPECIAL_VALUE = -1;
static {
e1.value = 0;
e2.value = 1;
e3.value = SPECIAL_VALUE;
}
int value;
}