作为参数传递枚举类型

4

我想创建一个方法,它:

  • 接受枚举类型和字符串作为参数
    • 字符串是一个特定枚举实例的名称
  • 返回与该名称相匹配的枚举实例。

我尝试过的:

TestUtil.java类中:

public static <E extends Enum<E>> E mapToEnum(Enum<E> mappingEnum, String data) {

    return mappingEnum.valueOf(E, data); // Not working, needs Class of Enum and String value
}

枚举类型:
public enum TestEnum {
    TEST1("A"),
    TEST2("B");

    private String value;

    private TestEnum(String value) {
        this.value = value;
    }
}

如何运作(例如在主方法中):
TestEnum x = TestUtil.mapToEnum(TestEnum.class, "TEST1"); // TEST1 is the name of the first enum instance

问题是,我无法弄清楚需要传递什么到mapToEnum方法中,以便我可以从该枚举类型获取valueOf


2
什么是 entry - Michał Krzywański
1
entry.getKey() 是什么? - GauravRai1512
1
你为什么期望 mapToEnum 能够适用于每一个枚举?如果它没有值,该怎么办?此外,枚举中的值是私有的,所以你是如何获取它们的? - Michael
2
@MauriceNino 由于问题已关闭,而我正准备写一个答案 - 这是你代码的修复方法。使用这个方法:static <T extends Enum<T>> T mapToEnum(Class<T> mappingEnum, String data) { return Enum.valueOf(mappingEnum, data); } - Fenio
1
@Tom,我编辑了问题以便更清楚地表达。 - MauriceNino
显示剩余8条评论
3个回答

3
如果你提供的代码是可以接受的:
public static <E extends Enum<E>> E mapToEnum(Enum<E> mappingEnum, String data) {

    return mappingEnum.valueOf(E, data); // Not working, needs Class of Enum and String value
}

那么你所需要做的就是修复它。

这是我测试过的代码:

static <T extends Enum<T>> T mapToEnum(Class<T> mappingEnum, String data) {
    return Enum.valueOf(mappingEnum, data);
}

使用方法:

@Test
public void test() {
    TestEnum myEnum = mapToEnum(TestEnum.class, "TEST1");
    System.out.println(myEnum.value); //prints "A"
}

1

强烈建议使用Apache commons-lang库来处理像这样的样板函数...

TestEnum x = EnumUtils.getEnum(TestEnum.class, "TEST1");

这段代码与@Fenio演示的完全相同,但处理null或错误输入时会返回null而不是抛出异常。

如果您不知道这一点,请查看lang3库中的其他内容。我认为它是事实上的标准,可以节省数百万开发人员重新编写次要的管道实用程序。


0

以下是您如何迭代枚举类值并与您在方法中传递的参数匹配的方法,请查看下面的代码。

  enum TestEnum {
    TEST1("test1"),
    TEST2("test2");

   private String value;

   private TestEnum(String value) {
       this.value = value;
   }
   public String getName() {
       return value;
   }
   public static TestEnum mapToEnum(String data) {
       for (TestEnum userType : TestEnum.values()) {
           if (userType.getName().equals(data)) {
               return userType;
           }
       }
       return null;
   }
}

5
请勿使用==进行字符串比较。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接