日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 设置两个方法互斥_分享两个操作Java枚举的实用方法

發布時間:2023/12/2 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 设置两个方法互斥_分享两个操作Java枚举的实用方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 前言

Java枚舉在開發中是非常實用的。今天再來分析幾個小技巧并且回答一些同學的的疑問。首先要說明的是我的枚舉建立在以下的范式之中:

枚舉統一接口范式

2. 如何把枚舉值綁定的下拉列表

這種場景非常常見,如果你把狀態、類別等屬性封裝成枚舉的結構,就像下面一樣,一個標識對應一個狀態,這是典型的下拉列表結構。

public?enum?EnabledEnum?implements?Enumerator?{
????/**
?????*?Disable?status?enum.
?????*/
????DISABLE(0,?"不可用"),
????/**
?????*?Enable?status?enum.
?????*/
????ENABLE(1,?"可用");

????private?final?int?value;
????private?final?String?description;

????EnabledEnum(int?value,?String?description)?{
????????this.value?=?value;
????????this.description?=?description;
????}

????@Override
????public?int?value()?{
????????return?this.value;
????}

????@Override
????public?String?description()?{
????????return?this.description;
????}
}

前端希望能夠獲取這些狀態作為下拉列表的填充,你該如何解析封裝它呢?這里我有兩個辦法,第一個你可以從JSON 類庫 Jackson 優雅序列化 Java 枚舉類一文獲得解決方案;第二種更加簡單一些,寫一個工具類就可以了。

public?static??&?Enumerator>?Map?enumToMap(Class?clazz)?{
????E[]?enumConstants?=?clazz.getEnumConstants();
????Map?map?=?new?LinkedHashMap<>();for?(E?e?:?enumConstants)?{
????????map.put(e.value(),?e.description());
????}return?map;
}

這里用了Java 8的新特性附加約束。也就是說extends后面可以在通過&符號附加額外約束,可以重復使用,注意必須為接口類型,不能為抽象類或者其他Class。表示泛型的上界受到多個約束的制約。 & Enumerator>可以解讀為E必須為一個枚舉類而且同時還必須實現Enumerator接口。

為什么實現Enumerator接口?第一個好處是可以規定統一的范式;第二個好處是解析的時候不用轉換了。

此外我嘗試用Stream來封裝,但是發現過于復雜了,雖然成功了但是有點難以理解,這里也分享一下:

public?static??&?Enumerator>?Map?enumToOptions(Class?enumClazz){//?合并時檢查?key?是否重復
????BinaryOperator?merge?=?(u,?v)?->?{throw?new?IllegalStateException(String.format("Duplicate?key?%s",?u));
????};
????Enumerator[]?enumConstants?=?enumClazz.getEnumConstants();return?Stream.of(enumConstants)
??????????.collect(Collectors.toMap(Enumerator::value,
??????????????????Enumerator::description,
??????????????????merge,LinkedHashMap::new));
}

3. 如何根據值找到枚舉

這種也很常見,最直接的方式是寫一個switch語句。但是每個類都寫一個就非常繁瑣。所以這個也可以寫一個工具類,這次用Stream就簡單的多了。

public?static??&?Enumerator>?Optional?getEnumByValue(Class?enumClazz,?final?Integer?value){return?Stream.of(enumClazz.getEnumConstants())
????????????.filter(enumerator?->?Objects.equals(enumerator.code(),value))
????????????.findAny();
}

返回Optional是因為有可能給出的value沒有對應的枚舉。

4. 總結

今天分享了兩個小工具類來操作枚舉,不光運用了枚舉的一些知識,同時也使用了Java 8的三個新特性:泛型附加約束OptionalStream API。這些知識點以往我都分享過,有興趣的可以到 felord.cn 搜索一下。如果你有更好的辦法可以留言討論。多多關注:碼農小胖哥,更多原創干貨分享。

總結

以上是生活随笔為你收集整理的java 设置两个方法互斥_分享两个操作Java枚举的实用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。