亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號