用Java将Int转换为Enum?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (72)

给定以下枚举,在Java中将Int强制转换为枚举的方法是什么?

public enum MyEnum
{
    EnumValue1,
    EnumValue2
}


MyEnum enumValue = (MyEnum) x; //Doesn't work???
提问于
用户回答回答于

试一试MyEnum.values()[x] x一定是01,即该枚举的有效序号。

注意,在Java中,枚举实际上是类(枚举值就是对象),因此不能强制转换int甚至Integer

用户回答回答于

你可以迭代values()的整数值与给定的id值的进行比较如下所示:

public enum  TestEnum {
    None(0),
    Value1(1),
    Value2(2),
    Value3(3),
    Value4(4),
    Value5(5);

    private final int value;
    private TestEnum(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public static TestEnum  getEnum(int value){
        for (TestEnum e:TestEnum.values()) {
            if(e.getValue() == value)
                return e;
        }
        return TestEnum.None;//For values out of enum scope
    }
}

然后像这样使用:

TestEnum x = TestEnum.getEnum(4);//Will return TestEnum.Value4

用户回答回答于

这是我的解决方案。这不仅适用于非顺序整数,而且还应适用于你可能希望用作枚举值的基础id的任何其他数据类型。

public Enum MyEnum {
    THIS(5),
    THAT(16),
    THE_OTHER(35);

    private int id; // Could be other data type besides int
    private MyEnum(int id) {
        this.id = id;
    }

    public int getId() {
        return this.id;
    }

    public static Map<Integer, MyEnum> buildMap() {
        Map<Integer, MyEnum> map = new HashMap<Integer, MyEnum>();
        MyEnum[] values = MyEnum.values();
        for (MyEnum value : values) {
            map.put(value.getId(), value);
        }

        return map;
    }
}

我只需要在特定的时间(从文件中加载数据时)将id转换为枚举,所以我没有将Map始终保存在内存中。如果你需要在任何时候都可以访问Mapping,则可以始终将其缓存为Enum类的静态成员。

用户回答回答于
用户回答回答于

Java枚举没有和C++中相同的枚举到int映射。

也就是说,所有的枚举都有一个values方法返回可能的枚举值数组,因此

MyEnum enumValue = MyEnum.values()[x];

应该管用。但是最好不要尝试ints到Enum s

用户回答回答于

这不是通常做的事,所以我会重新考虑。但是,尽管如此,基本操作是:使用EnumType.value()的int->enumintNum,和enum->int使用enumInst.ordinal()。

但是,由于values()的实现,只能给你一个数组的副本,所以使用EnumMap缓存enum->int映射会更好。

用户回答回答于

你可以这样做。

使用元素id创建类。

      public Enum MyEnum {
        THIS(5),
        THAT(16),
        THE_OTHER(35);

        private int id; // Could be other data type besides int
        private MyEnum(int id) {
            this.id = id;
        }

        public static MyEnum fromId(int id) {
                for (MyEnum type : MyEnum.values()) {
                    if (type.getId() == id) {
                        return type;
                    }
                }
                return null;
            }
      }

现在使用id作为int来获取这个Enum。

MyEnum myEnum = MyEnum.fromId(5);
用户回答回答于

我保存了这些值并创建一个简单的静态访问方法:

public static enum EnumAttributeType {
    ENUM_1,
    ENUM_2;
    private static EnumAttributeType[] values = null;
    public static EnumAttributeType fromInt(int i) {
        if(EnumAttributeType.values == null) {
            EnumAttributeType.values = EnumAttributeType.values();
        }
        return EnumAttributeType.values[i];
    }
}
用户回答回答于

如果要给出整数值,可以使用如下结构

public enum A
{
        B(0),
        C(10),
        None(11);
        int id;
        private A(int i){id = i;}

        public int GetID(){return id;}
        public boolean IsEmpty(){return this.equals(A.None);}
        public boolean Compare(int i){return id == i;}
        public static A GetValue(int _id)
        {
            A[] As = A.values();
            for(int i = 0; i < As.length; i++)
            {
                if(As[i].Compare(_id))
                    return As[i];
            }
            return A.None;
        }
}
用户回答回答于

MyEnum.values()[x]的代价很高,所以你可以这样做:

public enum MyEnum {
    EnumValue1,
    EnumValue2;

    public static MyEnum fromInteger(int x) {
        switch(x) {
        case 0:
            return EnumValue1;
        case 1:
            return EnumValue2;
        }
        return null;
    }
}

扫码关注云+社区