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的三個新特性:泛型附加約束、Optional和Stream API。這些知識點以往我都分享過,有興趣的可以到 felord.cn 搜索一下。如果你有更好的辦法可以留言討論。多多關注:碼農小胖哥,更多原創干貨分享。
總結
以上是生活随笔為你收集整理的java 设置两个方法互斥_分享两个操作Java枚举的实用方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 结合前段修改mysql表数据_jquer
- 下一篇: java 数组 内存_图解Java数组的