在Java中给定以下enum,将Int类型转换为enum的正确方法是什么?
public enum MyEnum
{
EnumValue1,
EnumValue2
}
MyEnum enumValue = (MyEnum) x; //Doesn't work???
在Java中给定以下enum,将Int类型转换为enum的正确方法是什么?
public enum MyEnum
{
EnumValue1,
EnumValue2
}
MyEnum enumValue = (MyEnum) x; //Doesn't work???
当前回答
这与医生给出的答案相同,但它展示了如何用可变数组消除问题。如果你使用这种方法,因为分支预测,如果将有非常小的影响到零,整个代码只调用可变数组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;
}
其他回答
你可以这样试试。 用元素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);
尝试myenumn .values()[x],其中x必须为0或1,即枚举的有效序数。
注意,在Java中枚举实际上是类(enum值因此是对象),因此您不能将int甚至Integer强制转换为enum。
这不是通常做的事情,所以我会重新考虑。但话虽如此,基本操作是:int——> enum使用EnumType.values()[intNum],和enum——> int使用enumInst.ordinal()。
但是,由于values()的任何实现都只能提供数组的副本(java数组从来不是只读的),因此最好使用EnumMap来缓存enum——> int映射。
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;
}
}
我缓存这些值并创建一个简单的静态访问方法:
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];
}
}