问题:
为了让开发中的代码可读性增加,可以使用 Enum 类型,但是 String 转 Enum 类型需要分情况讨论。网上过多的解答都是部分情况,现记录如下:
情况一
假设定义了如下的enum(枚举):
public enum Blah {
A, B, C, D
}
已知枚举对应的String值,希望得到对应的枚举值。例如,已知"A",希望得到对应的枚举——Blah.A,应该怎么做?
使用 Blah.valueOf(“A”) 将会得到 Blah.A 类型
静态方法valueOf() 和 values() 不存在于源码中,而是在编译时创建,我们也可以在JavaDoc查看到它们,比如 Dialog.ModalityTyp 就中出现这两个方法。
情况二
当文本和枚举值不同时
public enum DetectionClass {
真实性("authenticity"),
完整性("integrity"),
可用性("usability"),
安全性("security");
public static DetectionClass fromString(String text) {
for (DetectionClass d : DetectionClass.values()) {
if (d.getValue().equalsIgnoreCase(text)) {
return d;
}
}
throw new IllegalArgumentException("No constant with text " + text + " found");
}
}
fromString 方法就可以将一个 String 转化为对应的 Enum 类
情况三
在情况二 基础上,如果 DetectionClass 基础了一个公共父类,则可以在公共父类中添加如下的一个工具方法:
static EnumService getEnum(Class<? extends EnumService> clazz, String valueText) {
try {
Method method = clazz.getMethod( "values" );
EnumService[] inter = (EnumService[]) method.invoke( null, null );
for (EnumService value : inter) {
if (value.getValue().equals( valueText )) {
return value;
}
}
return null;
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
EnumService是 enum 的公共父类。