【问题标题】:How do I store Enum types into a map?如何将枚举类型存储到地图中?
【发布时间】:2014-06-18 22:32:39
【问题描述】:

我正在尝试存储和检索枚举类,以便以后可以找到正确的类型(基于配置)并在其上调用 ValueOf 以解析字符串。如何放置/获取然后调用 ValueOf?

在伪代码中它看起来像这样:

enum MyType { VAL1, VAL2 };
enum MyColors { BLUE, RED };
Map<String, Class> map = Maps.newHashMap();
map.put("key1", MyType.class);      //this is the MyType enum above
map.put("colors", MyColors.class);  //this is the MyColors enum above
...
String inputType = "colors";
String inputValue = "BLUE";
Class c = map.get(inputType);
assertEquals(MyColors.BLUE, c.ValueOf(inputValue));  //here I want MyColors.ValueOf() to get called
Class c2 = map.get("key1");
assertEquals(MyType.VAL1, c.ValueOf("VAL1"));  //here I want MyType.ValueOf() to get called

我该怎么做?

为了说明我为什么这样做的一些背景 - 我有多种这样的枚举类型,我得到一个输入,告诉我它是什么类型的枚举(在文本中)和枚举中的一个值,所以我想要从地图中查找枚举类,然后调用它上面的静态 ValueOf 将正确解析。

注意 - 我不想在地图中存储 MyType 对象,我想存储类引用

谢谢!

【问题讨论】:

  • 为什么要这样做?如果你事先不知道它是哪个 Enum 类,你期望如何使用它?
  • 我不知道MyMap 是什么。 Class 没有 ValueOfvalueOf 方法,所以我不明白你在做什么。如果cMyMap.class,而我不知道MyMap 是什么,我什至无法猜测c.valueOf("VAL1") 会做什么。
  • 我已经更新了一些说明和更多示例 - 请让我知道还有什么可以使这一点更清楚(尤其是您的反对者)
  • @ajb,MyType 是一个枚举; MyTypel.class 应该是对该枚举类的引用;然后 c 应该再次成为该参考; c.ValueOf("VAL1") 应该相当于做 MyType.ValueOf("VAL1") 除非我不知道我的哪个枚举是所以我在地图中查找它
  • @durron597,我已经提供了一些细节,但基本上我正在尝试处理一些用户输入并将其转换为几种不同类型的枚举。在这一点上,我什至只是在语法上很好奇你是如何在 Java 中做到这一点的

标签: java enums


【解决方案1】:

你可以使用java.lang.Enum.valueOf(Class enumType, String name)



    enum MyType { VAL1, VAL2 };
    Map enumMap = Maps.newHashMap();
    map.put("key1", MyType.class);
    ...
    Class c = map.get("key1");
    assertEquals(MyType.VAL1, Enum.valueOf(c, "VAL1"));

【讨论】:

  • 啊哈 - Enum.ValueOf(Class, String) 似乎可以解决问题!您知道是否不能以其他方式执行此操作 - 是否可以通过类引用调用静态方法?
  • 是的,通过使用反射:c.getMethod("valueOf", String.class) 为您提供了“valueOf”的方法,您可以通过Object value = method.invoke(null, "VAL1") 调用它。 “值”对象是您的枚举实例
【解决方案2】:

不要使用 Class 作为第二种类型,而是使用您的枚举类型。

enum MyType { VAL1, VAL2 };

public static void main (String args[]){
    Map<String,MyType> map = new HashMap<String,MyType>();
}

【讨论】:

  • 目标是能够动态查找类型 - 用更多细节更新问题。
【解决方案3】:
public enum MyType {
    VAL1("value1"),
    VAL2("value2");

    private valueString;

    private enum MyType(String val) {
        valueString = val;
    }

    @Override
    public String toString() {
        return valueString;
    }
}

您似乎想使用 String 作为键,因此定义您的 MyType 枚举,然后设置和获取值:

Map<String, MyType> enumMap = new HashMap<String, MyType>();
enumMap.put("key", MyType.VAL1);

...

MyType keyVal = enumMap.get("key1");
String settingValue = keyVal.toString();  // will be "value1"

【讨论】:

  • 将 MyType 添加到定义将使其仅适用于 MyType。你必须使值扩展枚举:>
  • OP 仅指定他们想要存储该类型。如果问题不同,我的答案也会不同。
  • 我已经在问题中更明确地说明了这一点,但我确实试图在地图中存储对枚举的引用,以便稍后动态调用 ValueOf。我确实有多种枚举类型。
猜你喜欢
  • 2018-05-30
  • 1970-01-01
  • 2013-11-02
  • 2016-03-06
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多