在Java中有更好的方法将Int强制转换为enum吗



我看到这个问题

但我需要定义很多枚举类型并做很多重复工作,每个枚举都能扩展一些东西吗?像这样:

public static enum Type {
;
public final int value;
Type(int v) {
this.value = v;
}
public static Type fromInt(int v) {
for (Type type : values()) {
if (type.value == v) {
return type;
}
}
return null;
}
}

public static enum ENUM1 extends Type{
A(1), B(5), C(10);
}
public static enum ENUM2 extends Type{
D(1), E(20), F(30);
}

如本问题所示,您不能在java中对enums进行子类化。故事结束了。如果你详细描述了你想要实现的目标,人们可能会建议比枚举更好的解决方案。

关于从其int值解析到enum,您所做的操作将起作用,但最好这样做:

public enum MyEnum {
A(1),
B(2),
C(3);
private final int value;
MyEnum(int value) {
this.value = value;
}
private static Map<Integer, MyEnum> valueToEnumMap;
public static MyEnum parseFromValue(int value) {
if (valueToEnumMap == null) {
valueToEnumMap = new HashMap<>();
for (MyEnum myEnum : MyEnum.values()) {
valueToEnumMap.put(myEnum.value, myEnum);
}
}
return valueToEnumMap.get(value);
}
}

初始化一个Map,键为枚举的值,并为枚举本身赋值,然后从该映射中获取枚举。根据您的使用情况,您可能希望添加对重复密钥的检查,目前在重复的情况下,以后的对将覆盖以前的对。

或者,您也可以尝试一下。

import java.util.Arrays;
/** Int <-> Enum. */
public class EnumToIntMap
{
/**
* 
* Main method.
* 
* @param   args  commandline arguments, should they be needed.
* 
*/
public static void main(String[] args)
{

interface Type
{

int value();

static <E extends Enum<E> & Type> E fromValue(Class<E> clazz, final int value)
{

return
Arrays.stream(clazz.getEnumConstants())
.parallel()
.filter(each -> each.value() == value)
.findAny()
.orElseThrow()
;

}

}


enum Enum1 implements Type
{

A(1),
B(5),
C(10),
;

private final int value;

Enum1(int value)
{

this.value = value;

}

public int value()
{

return this.value;

}

}

enum Enum2 implements Type
{

D(1),
E(20),
F(30),
;

private final int value;

Enum2(int value)
{

this.value = value;

}

public int value()
{

return this.value;

}

}

}
}

最新更新