问题描述
如何从存储在地图中的枚举中获取值?
我在一个类中有多个枚举类型。这些枚举类型作为值存储在映射中。我的要求是从特定的枚举类型(作为参数传递的名称)获取值。
在以下示例中,Test1 和 Test2 存储在映射中。我想为 x 的传递值和枚举类型(Test1 和 Test2..)获取 Y 的相应值。
public class TestClass {
public enum Test1 {
Const1("x1","y1"),Const2("x2","y2");
private String x;
private String y;
Test1(String x,String y) {
this.x = x;
this.y = y;
}
}
public enum Test2 {
Const1("x1","y2");
private String x;
private String y;
Test2(String x,String y) {
this.x = x;
this.y = y;
}
}
public static final Map<String,Collection<? extends Enum<?>>> testMap = Collections.unmodifiableMap(
new HashMap<String,Collection<? extends Enum<?>>>() {
{
put("Test1",Arrays.asList(Test1.values()));
put("Test2",Arrays.asList(Test2.values()));
}
}
);
//get function to be called from outside
public static String getValueY(String x,String enumType) {
return testMap.get(enumType).stream()....
}
public static void main(String[] args) {
getValueY("x1","Test1"); //This should give value as y1
}
}
解决方法
一种类型安全的方法,无需反射:
声明一个接口:
interface Foo {
String getX();
String getY();
让所有枚举实现该接口:
public enum Test1 implements Foo { ...
现在您可以将地图更改为
Map<String,Collection<Foo>> testMap
然后允许您调用两种方法,getX()
和 getY()
。