您可以在枚举中使用将字符串映射到枚举常量的静态 Map。在“getEnum”静态方法中使用它。每次您想从其 String 值中获取一个枚举时,这将跳过遍历枚举的需要。
public enum RandomEnum {
StartHere("Start Here"),
StopHere("Stop Here");
private final String strVal;
private RandomEnum(String strVal) {
this.strVal = strVal;
}
public static RandomEnum getEnum(String strVal) {
if(!strValMap.containsKey(strVal)) {
throw new IllegalArgumentException("Unknown String Value: " + strVal);
}
return strValMap.get(strVal);
}
private static final Map<String, RandomEnum> strValMap;
static {
final Map<String, RandomEnum> tmpMap = Maps.newHashMap();
for(final RandomEnum en : RandomEnum.values()) {
tmpMap.put(en.strVal, en);
}
strValMap = ImmutableMap.copyOf(tmpMap);
}
@Override
public String toString() {
return strVal;
}
}
只需确保映射的静态初始化发生在枚举常量声明的下方。
顺便说一句 - 'ImmutableMap' 类型来自 Google guava API,在这种情况下我绝对推荐它。
编辑 - 根据评论:
- 此解决方案假定每个分配的字符串值都是唯一且非空的。鉴于枚举的创建者可以控制这一点,并且字符串对应于唯一且非空的枚举值,这似乎是一个安全的限制。
- 我按照问题中的要求添加了“toSTring()”方法