猿问

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

我有带有 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 parameter

myenum.values // This is array which is also not useful here

请建议如何在 Enum 中实现它?我正在使用 Java 8


并且还建议 Is enum right choice here? 还是我应该创建具有所有 50 个值或任何其他最佳方法的静态字符串类?


慕神8447489
浏览 97回答 1
1回答

胡说叔叔

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);    }}
随时随地看视频慕课网APP

相关分类

Java
我要回答