使用有构造方法的枚举类型的时候,通常可能会用到valueOf()方法,根据枚举类型,获取枚举类型的值,比如
String str = MonitorTarget.valueOf(GWCALLCOUNT);
,然后得到str的值是"网关:访问量"
。
valueOf()这个方法是枚举类型隐含自带的,通常也可以Override覆盖 toString方法来完成通过枚举类型获取值的功能。
然而有的情况下还需要从String转化到Enum对象,这个时候可以使用下面的两种fromString()方式。
public enum MonitorTarget {
GWCALLCOUNT("网关:访问量"),
ASCALLCOUNT("接入机:访问量"),
MSCALLCOUNT("微服务:访问量"),
DBCALLCOUNT("数据库:访问量");
private String targetName;
// 枚举类的构造函数必须要为private,因为不能在枚举类之外在调用构造函数来初始化枚举,枚举的内容在运行时就已经初始化好了,枚举类的内容相当于枚举类的一个个实体
private MonitorTarget(String targetName) {
this.targetName = targetName;
}
public String getTargetName() {
return this.targetName;
}
// 方法一:使用静态map对象,在enum实例化的时候,将各个对象放进map中,然后在需要的时候从map中来取
private static final Map<String, MonitorTarget> stringToEnum = new HashMap<String, MonitorTarget>();
static {
// Initialize map from constant name to enum constant
for(MonitorTarget mt : values()) {
stringToEnum.put(mt.targetName, mt);
// 也可以写成
//stringToEnum.put(mt.toString(), mt);
//stringToEnum.put(mt.getTargetName(), mt);
}
}
// Returns Blah for string, or null if string is invalid
public static MonitorTarget fromString2(String symbol) {
return stringToEnum.get(symbol);
}
// 方法二:在需要的时候循环枚举对象,根据值来匹配,返回枚举对象
public static MonitorTarget fromString(String text) {
if (text != null) {
for (MonitorTarget b : MonitorTarget.values()) {
if (text.equalsIgnoreCase(b.targetName)) {
return b;
}
}
}
return null;
}
@Override
public String toString() {
return this.targetName;
}
}