小编典典
我会findFirst改用:
return Arrays.stream(Type.values())
.filter(e -> e.s.equals(val))
.findFirst()
.orElseThrow(() -> new IllegalStateException(String.format("Unsupported type %s.", val)));
尽管Map在这种情况下a 可能更好:
enum Type{
X("S1"),
Y("S2");
private static class Holder {
static Map MAP = new HashMap<>();
}
private Type(String s) {
Holder.MAP.put(s, this);
}
public static Type find(String val) {
Type t = Holder.MAP.get(val);
if(t == null) {
throw new IllegalStateException(String.format("Unsupported type %s.", val));
}
return t;
}
}
我从这个答案中学到了这个技巧。基本上,类加载器会在枚举类之前初始化静态类,这使您可以Map将枚举构造器本身填充。非常便利
!
您想要一个Map,但是如何整齐地填充它呢?枚举不允许您在初始化枚举实例之前初始化静态字段,但是有一个巧妙的小技巧,称为“ 按需初始化holder idiom”,它使使用此功能所需的静态初始化映射变得容易实现:
public enum Code {
CODE_1("string1"),
CODE_2("string2"),
CODE_3("string3"),
// etc
;
private static class Holder {
static Map CODE_MAP = new HashMap<>();
}
private final String code;
private Code(String code) {
this.code = code;
Holder.CODE_MAP.put(code, this);
}
public String getCode() {
return this.code;
}
public Code convertFromString(String code) {
return CODE_MAP.get(code);
}
}
之所以可行,是因为类加载器在初始化枚举类之前先初始化内部静态类,因此将映射分配为在枚举实例初始化期间准备加载。
没有循环。无需特殊代码即可加载地图(在构造函数中完成)。最少的代码。
希望能帮助到你 !:)
2020-09-11