使用枚举中定义的静态字段作为构造函数中的参数

时间:2014-08-15 17:38:14

标签: java constructor enums

我有一个枚举,并希望在构造函数中使用静态值作为参数。

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在初始化之前被访问,因此这显然不起作用。我想知道是否有一个共同的解决方案。或者我不应该这样做的原因。

注意:某处可能有重复,但我能找到的一切都与在构造函数体中使用静态字段有关,而不是作为参数,我不认为这里提出的解决方案是适用的。

5 个答案:

答案 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;
}