为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕神8447489 2023-04-19 15:52:59
我有带有 50 个字符串检查的 switch case,以防如下所示:switch(str){  case "Employee number":    //setter    break;}我想把它们放在 Enum 中,描述如下: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 我得到字符串“员工编号”,我想以这样一种方式编写 switch case,以便我们可以将枚举的描述与 Case 中的传入字符串输入进行比较。我在枚举中尝试了一些方法myenum.valueOf(a); // This return enum value but not parametermyenum.values // This is array which is also not useful here请建议如何在 Enum 中实现它?我正在使用 Java 8并且还建议 Is enum right choice here? 还是我应该创建具有所有 50 个值或任何其他最佳方法的静态字符串类?
查看完整描述

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);

    }


}


查看完整回答
反对 回复 2023-04-19
  • 1 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信