1 回答
TA贡献1804条经验 获得超8个赞
MyEnum您可以先从中获取实例String str,然后使用switchby MyEnum,如下所示:
enum MyEnum {
EMPLOYEE_NUMBER("Employee number"),
FIRST_NAME("First name");
private String desc;
MyEnum(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
public static Optional<MyEnum> fromDesc(String desc) {
return Stream.of(MyEnum.values()).filter(myEnum -> myEnum.getDesc().equals(desc)).findFirst();
}
}
然后在您的主要代码中:
Optional<MyEnum> maybeMyEnum = MyEnum.fromDesc(str);
if (maybeMyEnum.isPresent()) {
switch(maybeMyEnum.get()){
case EMPLOYEE_NUMBER:
//setter
break;
}
}
UPD 1:
使用Optional.get()andOptional.isPresent()不是最佳实践 - 这个想法是 - 你必须推迟Optional尽可能多地获取价值。还Optional.get()违约getter:
Optional.get() 是一个“有吸引力的麻烦事”,对程序员来说诱惑力太大,导致错误频发。人们不希望 getter 抛出异常。
来自JDK-8140281 :(选择)添加 no-arg orElseThrow() 作为 get() 的首选替代方法
因此,鉴于此,您可以将代码重写为:
...
MyEnum.fromDesc(str)
.ifPresent(SomeClass::methodWithSwitchStatement);
...
class SomeClass {
public static void methodWithSwitchStatement(MyEnum myEnum) {
switch(myEnum){
case EMPLOYEE_NUMBER:
//setter
break;
}
}
}
...
上述代码中的名称仅供示例 - 您不应在项目中使用此类名称。
UPD 2:
这是带有缓存的版本MyEnum:
enum MyEnum {
EMPLOYEE_NUMBER("Employee number"),
FIRST_NAME("First name");
private static final Map<String, MyEnum> cacheByDesc;
static {
cacheByDesc = Stream.of(MyEnum.values()).collect(Collectors.toMap(MyEnum::getDesc, e -> e));
}
private String desc;
MyEnum(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
public static Optional<MyEnum> fromDesc(String desc) {
return Optional.ofNullable(desc)
.map(cacheByDesc::get);
}
}
添加回答
举报