问题
我有这样的枚举:
public enum PcapLinkType {
DLT_NULL(0)
DLT_EN10MB(1)
DLT_EN3MB(2),
DLT_AX25(3),
/*snip, 200 more enums, not always consecutive.*/
DLT_UNKNOWN(-1);
private final int value;
PcapLinkType(int value) {
this.value= value;
}
}
现在我从外部输入得到一个int并想要匹配的输入 - 如果一个值不存在则抛出一个异常是好的,但最好是在那种情况下我有它是DLT_UNKNOWN。
int val = in.readInt();
PcapLinkType type = ???; /*convert val to a PcapLinkType */
#1 热门回答(94 赞)
你需要手动执行此操作,方法是在将整数映射到枚举的类中添加静态映射,例如
private static final Map intToTypeMap = new HashMap();
static {
for (PcapLinkType type : PcapLinkType.values()) {
intToTypeMap.put(type.value, type);
}
}
public static PcapLinkType fromInt(int i) {
PcapLinkType type = intToTypeMap.get(Integer.valueOf(i));
if (type == null)
return PcapLinkType.DLT_UNKNOWN;
return type;
}
#2 热门回答(30 赞)
enum MyEnum {
FIRST, SECOND, THIRD;
private static MyEnum[] allValues = values();
public static MyEnum fromOrdinal(int n) {return allValues[n];}
}
原则上,你可以使用justvalues()[i],但有传言称values()每次调用时都会创建一个数组副本。
#3 热门回答(14 赞)
你必须创建一个新的静态方法,迭代PcapLinkType.values()并比较:
public static PcapLinkType forCode(int code) {
for (PcapLinkType typе : PcapLinkType.values()) {
if (type.getValue() == code) {
return type;
}
}
return null;
}
如果它很少被调用那就没问题。如果经常调用它,那么请查看其他人建议的Map优化。