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

public enum MyEnum
{
    EnumValue1,
    EnumValue2
}


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

当前回答

根据@ChadBefus的回答和@shmosel的评论,我建议使用这个。(高效查找,工作在纯java >= 8)

import java.util.stream.Collectors;
import java.util.function.Function;
import java.util.Map;
import java.util.Arrays;

public enum MyEnum {
    OPTION_1(-66),
    OPTION_2(32);

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

    public int getValue() {
        return this.value;
    }

    private static Map<Integer, MyEnum> reverseLookup =
        Arrays.stream(MyEnum.values()).collect(Collectors.toMap(MyEnum::getValue, Function.identity()));

    public static MyEnum fromInt(final int id) {
        return reverseLookup.getOrDefault(id, OPTION_1);
    }
    public static void main(String[] args) {
        System.out.println(fromInt(-66).toString());
    }
}

其他回答

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

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

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

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

一个好的选择是避免从int转换为enum:例如,如果您需要最大值,您可以比较x.o ordinal()和y.o ordinal()并相应地返回x或y。(您可能需要重新排序您的值,使这样的比较有意义。)

如果这是不可能的,我将存储myenumn .values()到一个静态数组。

这与医生给出的答案相同,但它展示了如何用可变数组消除问题。如果你使用这种方法,因为分支预测,如果将有非常小的影响到零,整个代码只调用可变数组values()函数只有一次。因为这两个变量都是静态的,所以每次使用这个枚举也不会消耗n *内存。

private static boolean arrayCreated = false;
private static RFMsgType[] ArrayOfValues;

public static RFMsgType GetMsgTypeFromValue(int MessageID) {
    if (arrayCreated == false) {
        ArrayOfValues = RFMsgType.values();
    }

    for (int i = 0; i < ArrayOfValues.length; i++) {
        if (ArrayOfValues[i].MessageIDValue == MessageID) {
            return ArrayOfValues[i];
        }
    }
    return RFMsgType.UNKNOWN;
}

根据@ChadBefus的回答和@shmosel的评论,我建议使用这个。(高效查找,工作在纯java >= 8)

import java.util.stream.Collectors;
import java.util.function.Function;
import java.util.Map;
import java.util.Arrays;

public enum MyEnum {
    OPTION_1(-66),
    OPTION_2(32);

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

    public int getValue() {
        return this.value;
    }

    private static Map<Integer, MyEnum> reverseLookup =
        Arrays.stream(MyEnum.values()).collect(Collectors.toMap(MyEnum::getValue, Function.identity()));

    public static MyEnum fromInt(final int id) {
        return reverseLookup.getOrDefault(id, OPTION_1);
    }
    public static void main(String[] args) {
        System.out.println(fromInt(-66).toString());
    }
}
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;
        }
    }
}