本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看活动链接
提问:如何从Java中的字符串值获取枚举值?
说我有一个枚举
public enum Blah {
A, B, C, D
}
并且我想找到一个字符串的枚举值,例如”A”它将是Blah.A。怎么可能做到这一点?
是Enum.valueOf()我需要的方法吗?如果是这样,我将如何使用它?
高分回答:
是的,Blah.valueOf(“A”)会给你的Blah.A。
请注意,该名称必须是精确匹配,包括大小写:Blah.valueOf(“a”)与Blah.valueOf(“A “)两抛出IllegalArgumentException。
静态方法valueOf()和values()是在编译时创建的,不会出现在源代码中。但是,它们确实出现在Javadoc中。例如,Dialog.ModalityType显示两种方法。
高分回答:
使用来自有效Java的Joshua Bloch的模式:
(为简便起见,将其简化)
enum MyEnum {
ENUM_1(“A”),
ENUM_2(“B”);
private String name;
private static final Map<String,MyEnum> ENUM_MAP;
MyEnum (String name) {
this.name = name;
}
public String getName() {
return this.name;
}
// Build an immutable map of String name to enum pairs.
// Any Map impl can be used.
static {
Map<String,MyEnum> map = new ConcurrentHashMap<String, MyEnum>();
for (MyEnum instance : MyEnum.values()) {
map.put(instance.getName().toLowerCase(),instance);
}
ENUM_MAP = Collections.unmodifiableMap(map);
}
public static MyEnum get (String name) {
return ENUM_MAP.get(name.toLowerCase());
}
复制代码
}
另请参阅:
文章翻译自 am2dgbqfb6mk75jcyanzabc67y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/6…
作者建议:建议使用静态块来初始化放入map中,枚举是支持嵌套的,可以来实现更多易扩展的内容
给一个简单的接口枚举例子
public enum SaasApiEnum {
/**
* 企业创建
*/
ORG_CREATE("企业创建", SaasApi.ORG_CREATE),
;
SaasApiEnum(String name, String api) {
this.name = name;
this.api = api;
}
/**
* 接口名
*/
private final String name;
/**
* 接口地址
*/
private final String api;
/**
* 枚举映射,快速解析用,key为枚举name()
*/
private static final Map<String, SaasApiEnum> MAPPINGS = new HashMap<>(64);
static {
for (SaasApiEnum anEnum : values()) {
MAPPINGS.put(anEnum.api, anEnum);
}
}
/**
* 解析给定的接口地址为当前枚举类型
*
* @param api 接口地址
* @return 对应的枚举,or null if not found
*/
public static SaasApiEnum resolve(String api) {
return (api != null ? MAPPINGS.get(api) : null);
}
public String getName() {
return name;
}
public String getApi() {
return api;
}
}
复制代码
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞? 求关注❤️ 求分享? 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️