[英]How to use Switch and Enum Parameters (Not ENUM VALUE) in Java?
我有50个字符串检查的情况下开关,如下所示:
switch(str){
case "Employee number":
//setter
break;
}
我想将它们放在枚举中,如下所示:
enum myenum{
EMPLOYEE_NUMBER("Employee number"),
FIRST_NAME("First name");
private String desc;
private myenum(String desc) {
this.setDesc(desc);
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
现在,从Source中,我得到了字符串“ Employee Number”,并且我想以这样的方式编写切换用例:我们可以将枚举的描述与Case中传入的字符串输入进行比较。
我在枚举中尝试了一些方法
myenum.valueOf(a); // This return enum value but not parameter
myenum.values // This is array which is also not useful here
请提出如何在枚举中实现? 我正在使用Java 8
并建议在这里枚举是正确的选择吗? 还是应该创建具有全部50个值或其他最佳出路的静态字符串类?
你可以先拿到MyEnum
从实例String str
,然后用switch
由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:
正如@Ole VV(在评论中所述)那样,使用Optional.get()
和Optional.isPresent()
并不是最佳实践-这个想法是-您必须尽可能推迟从Optional
获得价值。 另外Optional.get()
违反了getter
合同:
Optional.get()是一个“令人讨厌的麻烦”,对程序员来说很诱人,从而导致频繁的错误。 人们不期望吸气剂引发异常。
从JDK-8140281:(opt)添加no-arg或ElseThrow()作为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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.