前言:
由于刚转java项目,所以对于java语言比较陌生,尤其是lambda和一些诸如(一个java文件只能有一个public class)等等的零散知识点之类。。。
使我觉得就语言的层级来说。.net真的超越java不是一星半点。奈何.net跨平台晚,社区力量也小。
相交枚举而言。真的没有 .net中给枚举添加attrbuite来的方便。.net枚举:Enum 枚举值 (一) 获取描述信息_正怒月神的博客-CSDN博客_enum 获取
由于公司需要多语言,所以枚举中希望能增添额外的属性。
并且提供共同的操作方法。
下面给大家看一下java中的枚举操作方法的封装。(由于是java的菜鸡,所以将就着用)
先看一下文件结构
然后我们看一下各个文件:
一:EnumItem
封装了一些常用属性,属性命名很直白了,就不解释了
(这里key设置了泛型,是由于特殊情况不需要Integer类型)
package com.leadtrans.report.model.Enum;/*** @author: Tyler* @createDate: 2021/12/8*/public class EnumItem<T> {private T key;private String val;public EnumItem(){}public T getKey() {return key;}public void setKey(T key) {this.key = key;}public String getVal() {return val;}public void setVal(String val) {this.val = val;}
}
二 EnumList
存放枚举值,每个枚举都继承了IEnumList接口,并且重写了getEnumItem()方法。
不知道接口能不能通过 default来默认实现。大家可以尝试一下。
package com.leadtrans.report.model.Enum;import io.swagger.annotations.ApiModelProperty;/*** @author: Tyler* @createDate: 2021/12/8*/public class EnumList {public interface IEnumList {EnumItem getEnumItem();}//reportpublic enum ReportEnum implements IEnumList {PS_1(0,"海外代理数量 同比/环比"),PS_2(1,"销售货量 同比、环比,可合并"),;private EnumItem item=new EnumItem();ReportEnum(Integer key,String Value) {item.setKey(key);item.setVal(Value);}@Overridepublic EnumItem<Integer> getEnumItem() {return item;}}//是否有效public enum IsValidEnum implements IEnumList {Invalid(0, "无效"),Valid(1, "有效");private EnumItem item=new EnumItem();IsValidEnum(Integer key,String Value) {item.setKey(key);item.setVal(Value);}@Overridepublic EnumItem<Integer> getEnumItem() {return item;}}}
三 EnumHelper
重头戏,注释比较简单,大家应该明白的。
package com.leadtrans.report.common;import com.leadtrans.report.model.Enum.EnumItem;
import com.leadtrans.report.model.Enum.EnumList;import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;/*** @author: Tyler* @createDate: 2021/12/8*/public class EnumUtil {/*** 获取枚举集合** Enum** @param <T>* @return List<EnumItem>*/public static <T extends EnumList.IEnumList> List<EnumItem> getEnumList(Class<? extends EnumList.IEnumList> enumClass) {T[] q = (T[]) enumClass.getEnumConstants();List<EnumItem> v = Arrays.stream(q).map(T::getEnumItem).collect(Collectors.toList());return v;}/*** 根据字符串,动态获取枚举值* @param enumName* @param <T>* @return* @throws ClassNotFoundException*/public static <T extends EnumList.IEnumList> List<EnumItem> getEnumList(String enumName) {try {Class enumClass=Class.forName(EnumList.class.getName()+"$"+enumName);return getEnumList(enumClass);} catch (ClassNotFoundException e) {e.printStackTrace();return null;}}/*** 根据枚举类型和key获取信息** @param enumClass* Enum* @param key* Enum key* @param <T>* @return EnumItem*/public static <T extends EnumList.IEnumList,U> EnumItem getEnumItem(Class<? extends EnumList.IEnumList> enumClass,U key) {T[] q = (T[]) enumClass.getEnumConstants();Optional<T> v = (Arrays.stream(q)).filter(x -> x.getEnumItem().getKey() == key).findFirst();if (v.equals(Optional.empty()))return null;T r = v.get();EnumItem s = r.getEnumItem();return s;}/*** 根据枚举类型和value获取信息** @param enumClass* Enum* @param value* Enum value* @param <T>* @return EnumItem*/public static <T extends EnumList.IEnumList> EnumItem getEnumItem(Class<? extends EnumList.IEnumList> enumClass,String value) {T[] q = (T[]) enumClass.getEnumConstants();Optional<T> v = (Arrays.stream(q)).filter(x -> x.getEnumItem().getVal() == value).findFirst();if (v.equals(Optional.empty()))return null;T r = v.get();EnumItem s = r.getEnumItem();return s;}}
四 TestApplication
测试运行
@Testpublic void testEnumList(){//获取枚举的键值对(class)List<EnumItem> list= EnumUtil.getEnumList(EnumList.IsValidEnum.class);//获取枚举的键值对(class name)List<EnumItem> list1= EnumUtil.getEnumList("IsValidEnum");//获取枚举 name,key,valEnumList.IsValidEnum[] list2 = EnumList.IsValidEnum.values();//根据枚举类型和key获取信息EnumItem item=EnumUtil.getEnumItem(EnumList.IsValidEnum.class,0);//根据枚举类型和value获取信息EnumItem item1=EnumUtil.getEnumItem(EnumList.IsValidEnum.class,"无效");}















