【问题标题】:Use a static field defined in an enum as an argument in the constructor使用枚举中定义的静态字段作为构造函数中的参数
【发布时间】:2014-08-15 17:38:13
【问题描述】:

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

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 在初始化之前就被访问了,所以这显然是行不通的。我想知道是否有一个通用的解决方案。或者我不需要这样做的原因。

注意:某处可能存在重复项,但我能找到的所有内容都与在构造函数主体中使用静态字段有关,而不是作为参数,而且我认为那里提供的解决方案不适用.

【问题讨论】:

  • 原因:在定义之前不能引用一个字段。
  • final的使用有问题吗?
  • @Jashaszun final 不会解决问题。
  • 既然可以直接输入想要的值,为什么还要在这里使用静态字段呢?
  • 看起来像XY-problem。你能解释一下在你的真实代码中从静态字段传递值的目的是什么?

标签: java constructor enums


【解决方案1】:
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());
    }
}

第一次尝试ideone,瞧! http://ideone.com/Bz1N69

【讨论】:

  • 啊,太简单了。此外,它还保持结构。谢谢
  • @MarJohnson 但是要小心这个解决方案,因为如果你想重写 SPECIAL_VALUE() 方法以实际返回一些静态 SPECIAL_VALUE 它将返回 0null 而不是实际值(因为它还没有被初始化)。
  • @Pshemo 好记。但我可以定义字段 SPECIAL_VALUE = SPECIAL_VALUE()。
【解决方案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;
}

【讨论】:

  • 另一个(更好的选择 IMO)是使用 static 方法而不是 static 常量。这样,您可以在运行时处理该值并使其成为枚举的常量。
【解决方案3】:

您可以反过来 - 使用文字值初始化 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;
    }
}

【讨论】:

  • 哦,我真的很讨厌这种设计。一切都倒退了。
  • @Sotirios:我不明白为什么,这和 OP 要求的一样有意义。无论哪种方式,Enum 类中仍然存在一个幻数。
  • @NathanHughes 别误会我的意思,我讨厌所有这些设计……我非常想看看用例。
【解决方案4】:

另一种方法是将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;
}

【讨论】:

    【解决方案5】:

    枚举本身是静态的,所以你可以这样做:

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

    }

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 2013-12-28
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多