获取与整型值关联的枚举

2022-08-31 10:54:34

以前,我的 LegNo 枚举被简单地定义为:

NO_LEG, LEG_ONE, LEG_TWO

通过调用 ,我能够获得与每个枚举关联的值。return LegNo.values()[i];

但是现在我决定我希望枚举是int -1而不是0,所以我决定使用私有构造函数来初始化和设置其int值LegNoNO_LEG

NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);

private LegNo(final int leg) { legNo = leg; }

现在唯一的事情是,因为我这样做,所以方法不适用于枚举。如何获取与 int 关联的枚举?除了使用 case switch 语句或 if-elseif-elseif 之外,是否有任何有效的方法来执行此操作values()NO_LEG

我可以看到很多与从枚举中获取int值有关的SO问题,但我追求的是相反的情况。


答案 1

编辑八月 2018

今天,我将按如下方式实现它

public enum LegNo {
    NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);

    private final int value;

    LegNo(int value) {
        this.value = value;
    }

    public static Optional<LegNo> valueOf(int value) {
        return Arrays.stream(values())
            .filter(legNo -> legNo.value == value)
            .findFirst();
    }
}

您必须在枚举内维护映射。

public enum LegNo {
    NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);

    private int legNo;

    private static Map<Integer, LegNo> map = new HashMap<Integer, LegNo>();

    static {
        for (LegNo legEnum : LegNo.values()) {
            map.put(legEnum.legNo, legEnum);
        }
    }

    private LegNo(final int leg) { legNo = leg; }

    public static LegNo valueOf(int legNo) {
        return map.get(legNo);
    }
}

静态块只会被调用一次,因此这里几乎没有性能问题。

编辑:将方法重命名为,因为它与其他Java类更加内联。valueOf


答案 2

还可以在枚举中包含一个静态方法,该方法循环访问所有成员并返回正确的成员。

public enum LegNo {
   NO_LEG(-1),
   LEG_ONE(1),
   LEG_TWO(2);

   private int legIndex;

   private LegNo(int legIndex) { this.legIndex = legIndex; }

   public static LegNo getLeg(int legIndex) {
      for (LegNo l : LegNo.values()) {
          if (l.legIndex == legIndex) return l;
      }
      throw new IllegalArgumentException("Leg not found. Amputated?");
   }
}

现在,如果要按整数获取枚举值,则只需使用:

int myLegIndex = 1; //expected : LEG_ONE
LegNo myLeg = LegNo.getLeg(myLegIndex);