问题

假设我有一个枚举

public enum Blah {
    A, B, C, D
}

我想找到一个字符串的枚举值,例如``A',它将成为Blah.A`。怎么可能做到这一点?

Enum.valueOf()是我需要的方法吗?如果是这样,我将如何使用它?


#1 热门回答(1833 赞)

是的,Blah.valueOf(“A”)会给你Blah.A

请注意,名称必须是不匹配的,包括case:Blah.valueOf(“a”)和Blah.valueOf(“A”)都会抛出IllegalArgumentException异常。

静态方法valueOf()values()是在编译时创建的,不会出现在源代码中。尽管如此,它们确实出现在Javadoc中;例如,Dialog.ModalityType显示了两种方法。


#2 热门回答(701 赞)

如果文本与枚举值不相同,则为另一种解决方案:

public enum Blah {
  A("text1"),
  B("text2"),
  C("text3"),
  D("text4");

  private String text;

  Blah(String text) {
    this.text = text;
  }

  public String getText() {
    return this.text;
  }

  public static Blah fromString(String text) {
    for (Blah b : Blah.values()) {
      if (b.text.equalsIgnoreCase(text)) {
        return b;
      }
    }
    return null;
  }
}

#3 热门回答(95 赞)

下面是我使用的一个漂亮的实用程序:

/**
 * A common method for all enums since they can't have another base class
 * @param <T> Enum type
 * @param c enum type. All enums must be all caps.
 * @param string case insensitive
 * @return corresponding enum, or null
 */
public static <T extends Enum<T>> T getEnumFromString(Class<T> c, String string) {
    if( c != null && string != null ) {
        try {
            return Enum.valueOf(c, string.trim().toUpperCase());
        } catch(IllegalArgumentException ex) {
        }
    }
    return null;
}

然后在我的枚举类中,我通常会保存一些输入:

public static MyEnum fromString(String name) {
    return getEnumFromString(MyEnum.class, name);
}

如果您的枚举不是全部大写,只需更改Enum.valueOf行。

太糟糕了,因为T被擦除,所以我不能使用T.class作为Enum.valueOf


原文链接