在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???
当前回答
写了这个实现。它允许缺失值、负值并保持代码的一致性。映射也会被缓存。使用接口,需要Java 8。
Enum
public enum Command implements OrdinalEnum{
PRINT_FOO(-7),
PRINT_BAR(6),
PRINT_BAZ(4);
private int val;
private Command(int val){
this.val = val;
}
public int getVal(){
return val;
}
private static Map<Integer, Command> map = OrdinalEnum.getValues(Command.class);
public static Command from(int i){
return map.get(i);
}
}
接口
public interface OrdinalEnum{
public int getVal();
@SuppressWarnings("unchecked")
static <E extends Enum<E>> Map<Integer, E> getValues(Class<E> clzz){
Map<Integer, E> m = new HashMap<>();
for(Enum<E> e : EnumSet.allOf(clzz))
m.put(((OrdinalEnum)e).getVal(), (E)e);
return m;
}
}
其他回答
Use MyEnum enumValue = MyEnum.values()[x];
这不是通常做的事情,所以我会重新考虑。但话虽如此,基本操作是:int——> enum使用EnumType.values()[intNum],和enum——> int使用enumInst.ordinal()。
但是,由于values()的任何实现都只能提供数组的副本(java数组从来不是只读的),因此最好使用EnumMap来缓存enum——> int映射。
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;
}
}
}
这是我打算采用的解决方案。这不仅适用于非连续整数,而且适用于您可能希望用作枚举值的底层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转换为enum,所以我没有理由一直将Map保存在内存中。如果您确实需要在任何时候都可以访问映射,那么您总是可以将它缓存为Enum类的静态成员。
如果你想给你的整数值,你可以使用如下结构
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;
}
}