在Java中给定以下enum,将Int类型转换为enum的正确方法是什么?

public enum MyEnum
{
    EnumValue1,
    EnumValue2
}


MyEnum enumValue = (MyEnum) x; //Doesn't work???

当前回答

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

其他回答

Java枚举没有c++中那样的枚举到int的映射。

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

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

应该工作。这有点讨厌,如果可能的话,最好不要尝试从int转换为enum(反之亦然)。

这不是通常做的事情,所以我会重新考虑。但话虽如此,基本操作是:int——> enum使用EnumType.values()[intNum],和enum——> int使用enumInst.ordinal()。

但是,由于values()的任何实现都只能提供数组的副本(java数组从来不是只读的),因此最好使用EnumMap来缓存enum——> int映射。

你可以这样试试。 用元素id创建Class。

      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 : values()) {
                    if (type.getId() == id) {
                        return type;
                    }
                }
                return null;
            }
      }

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

MyEnum myEnum = MyEnum.fromId(5);

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

enum MyEnum {
    A(0),
    B(1);
    private final int value;
    private MyEnum(int val) {this.value = value;}
    private static final MyEnum[] values = MyEnum.values();//cache for optimization
    public static final getMyEnum(int value) { 
        try {
            return values[value];//OOB might get triggered
        } catch (ArrayOutOfBoundsException e) {
        } finally {
            return myDefaultEnumValue;
        }
    }
}