繁体   English   中英

如何在Java中使用Switch和Enum参数(非ENUM VALUE)?

[英]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 ,然后用switchMyEnum ,象下面这样:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM