我有一个这样的枚举:
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 */
发布于 2011-03-14 06:13:01
您需要手动完成此操作,方法是在将整数映射到枚举的类中添加一个静态映射,例如
private static final Map<Integer, PcapLinkType> intToTypeMap = new HashMap<Integer, PcapLinkType>();
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;
}
发布于 2011-03-14 06:12:12
您必须创建一个新的静态方法,在此方法中迭代PcapLinkType.values()并进行比较:
public static PcapLinkType forCode(int code) {
for (PcapLinkType typе : PcapLinkType.values()) {
if (type.getValue() == code) {
return type;
}
}
return null;
}
如果很少调用它,那就很好了。如果它经常被调用,那么看看其他人建议的Map
优化。
发布于 2011-03-14 06:19:52
您可以这样做,自动将它们全部注册到一个集合中,然后使用该集合轻松地将整数转换为相应的枚举。(顺便说一句,将它们添加到枚举构造函数is not allowed中的映射中。即使在使用Java多年之后,学习新事物也是很好的。:)
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 static final Map<Integer, PcapLinkType> typesByValue = new HashMap<Integer, PcapLinkType>();
static {
for (PcapLinkType type : PcapLinkType.values()) {
typesByValue.put(type.value, type);
}
}
private final int value;
private PcapLinkType(int value) {
this.value = value;
}
public static PcapLinkType forValue(int value) {
return typesByValue.get(value);
}
}
https://stackoverflow.com/questions/5292790
复制相似问题