说我有一个枚举
public enum Blah {
A, B, C, D
}
我想找到一个字符串的枚举值,例如"A"
就是Blah.A
怎么可能做到这一点?
Enum.valueOf()
是我需要的方法吗? 如果是这样,我将如何使用它?
#1楼
这是我使用的一个漂亮的实用程序:
/**
* 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
被删除了, Enum.valueOf
我不能对Enum.valueOf
使用T.class
。
#2楼
如果您不想编写自己的实用程序,请使用Google的guava库:
Enums.getIfPresent(Blah.class, "A")
与内置的Java函数不同,它让您检查Bl中是否存在A且不引发异常。
#3楼
使用Guava库的解决方案。 方法getPlanet()不区分大小写,因此getPlanet(“ MerCUrY”)将返回Planet.MERCURY。
package com.universe.solarsystem.planets;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Enums;
import com.google.common.base.Optional;
//Pluto and Eris are dwarf planets, who cares!
public enum Planet {
MERCURY,
VENUS,
EARTH,
MARS,
JUPITER,
SATURN,
URANUS,
NEPTUNE;
public static Planet getPlanet(String name) {
String val = StringUtils.trimToEmpty(name).toUpperCase();
Optional <Planet> possible = Enums.getIfPresent(Planet.class, val);
if (!possible.isPresent()) {
throw new IllegalArgumentException(val + "? There is no such planet!");
}
return possible.get();
}
}
#4楼
为了增加以前的答案,并解决有关null和NPE的一些讨论,我使用Guava Optionals处理缺席/无效案件。 这非常适合URI /参数解析。
public enum E {
A,B,C;
public static Optional<E> fromString(String s) {
try {
return Optional.of(E.valueOf(s.toUpperCase()));
} catch (IllegalArgumentException|NullPointerException e) {
return Optional.absent();
}
}
}
对于那些不知道的人,这里有一些有关使用Optional避免null的更多信息: https : //code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained#Optional
#5楼
java.lang.Enum
定义了几种有用的方法,这些方法可用于Java中的所有枚举类型:
- 您可以使用
name()
方法获取任何Enum常量的名称。 用于写枚举常量的字符串文字是它们的名称。 - 类似地,
values()
方法可用于从Enum类型获取所有Enum常量的数组。 - 对于询问的问题,可以使用
valueOf()
方法将Java中的任何String转换为Enum常量,如下所示。
public class EnumDemo06 {
public static void main(String args[]) {
Gender fromString = Gender.valueOf("MALE");
System.out.println("Gender.MALE.name() : " + fromString.name());
}
private enum Gender {
MALE, FEMALE;
}
}
Output:
Gender.MALE.name() : MALE
在此代码段中, valueOf()
方法返回一个Enum常量Gender.MALE,对其调用的名称将返回"MALE"
。
#6楼
如果文本与枚举值不同,则另一种解决方案:
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;
}
}
#7楼
您可能需要这样做:
public enum Obj