将整数值转换为匹配的 Java 枚举

2022-08-31 11:29:05

我有一个这样的枚举:

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

您需要手动执行此操作,方法是在将整数映射到枚举的类中添加静态映射,例如

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

答案 2

有一个静态方法被记录下来,但不是你期望它的地方:http://docs.oracle.com/javase/tutorial/java/javaOO/enum.htmlvalues()

enum MyEnum {
    FIRST, SECOND, THIRD;
    private static MyEnum[] allValues = values();
    public static MyEnum fromOrdinal(int n) {return allValues[n];}
}

原则上,您可以只使用 ,但有传言说每次调用数组时都会创建数组的副本。values()[i]values()


推荐