获取与int值关联的枚举

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

NO_LEG, LEG_ONE, LEG_TWO 

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

但是现在我已经决定了我希望LegNo枚举NO_LEG是int -1而不是0,所以我决定使用一个私有的构造函数来初始化和设置它的int值

 NO_LEG(-1), LEG_ONE(1), LEG_TWO(2); private LegNo(final int leg) { legNo = leg; } 

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

我可以看到很多关于从枚举中获取int值的问题,但是我正好相反。

你必须在枚举中保持一个映射。

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

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

编辑:将方法重命名为valueOf因为它与其他Java类更直接。

你也可以在枚举中包含一个静态方法来迭代所有成员,并返回正确的方法。

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

adarshr的答案适应了Java 8:

 import static java.util.Arrays.stream; import static java.util.stream.Collectors.toMap; import java.util.Map; public enum LegNo { NO_LEG(-1), LEG_ONE(1), LEG_TWO(2); private final int legNo; private final static Map<Integer, LegNo> map = stream(LegNo.values()).collect(toMap(leg -> leg.legNo, leg -> leg)); private LegNo(final int leg) { legNo = leg; } public static LegNo valueOf(int legNo) { return map.get(legNo); } } 

您也可以通过调用enum LegNo上的values()方法来访问对应于给定整数值的Enum值。 它返回LegNo枚举的字段: LegNo.values[0]; //returns LEG_NO LegNo.values[1]; //returns LEG_ONE LegNo.values[2]; //returns LEG_TWO LegNo.values[0]; //returns LEG_NO LegNo.values[1]; //returns LEG_ONE LegNo.values[2]; //returns LEG_TWO

不是他正在寻找的东西,但确实非常接近,但非常简单。 (虽然主题已经死了,但对其他人可能有用。)

既然你的枚举只包含3个元素,最快的方法就是像你所build议的那样使用一系列if else

编辑:adarshr提供的答案更适合一般情况下,有很多枚举值,但我认为这是对你的问题矫枉过正。

具有默认值的Java 8方式:

 public enum LegNo { NO_LEG(-1), LEG_ONE(1), LEG_TWO(2); private final int legNo; LegNo(int legNo) { this.legNo = legNo; } public static LegNo find(int legNo, Supplier<? extends LegNo> byDef) { return Arrays.asList(LegNo.values()).stream() .filter(e -> e.legNo == legNo).findFirst().orElseGet(byDef); } } 

致电:

 LegNo res = LegNo.find(0, () -> LegNo.NO_LEG); 

或者例外:

 LegNo res = LegNo.find(0, () -> { throw new RuntimeException("No found"); }); 
 public enum LegNo { NO_LEG(-1), LEG_ONE(1), LEG_TWO(2); private int legNo; private LegNo(int leg) { legNo = leg; } public static LegNo valueOf(int legNo) { for (LegNo leg : LegNo.values()) { if (leg.legNo == legNo) return leg; } } } assert LegNo.valueOf(2) == LegNo.LEG_TWO assert LegNo.valueOf(3) == null 
 public enum body { NO_LEG = 0, // bit 1 LEG_ONE = 2, // bit 2 LEG_TWO = 4, // bit 3 NO_ARM = 8, // bit 4 ARM_ONE = 16, // bit 5 ARM_TWO = 32 // bit 6 } 

像这样使用它(int)body.LEG_ONE; ///返回2

这也是非常快的,并且易于阅读,因为它是在编译时完成的。