首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将整数值转换为匹配的Java枚举

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

Stack Overflow用户
提问于 2011-03-14 06:08:25
回答 11查看 108.8K关注 0票数 89

我有一个这样的枚举:

代码语言:javascript
复制
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

代码语言:javascript
复制
int val = in.readInt();
PcapLinkType type = ???; /*convert val to a PcapLinkType */
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-03-14 06:13:01

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

代码语言:javascript
复制
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;
}
票数 109
EN

Stack Overflow用户

发布于 2011-03-14 06:12:12

您必须创建一个新的静态方法,在此方法中迭代PcapLinkType.values()并进行比较:

代码语言:javascript
复制
public static PcapLinkType forCode(int code) {
    for (PcapLinkType typе : PcapLinkType.values()) {
        if (type.getValue() == code) {
            return type;
        }
    }
    return null;
 }

如果很少调用它,那就很好了。如果它经常被调用,那么看看其他人建议的Map优化。

票数 16
EN

Stack Overflow用户

发布于 2011-03-14 06:19:52

您可以这样做,自动将它们全部注册到一个集合中,然后使用该集合轻松地将整数转换为相应的枚举。(顺便说一句,将它们添加到枚举构造函数is not allowed中的映射中。即使在使用Java多年之后,学习新事物也是很好的。:)

代码语言:javascript
复制
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);
    }
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5292790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档