java 枚举 封装操作方法
前言:
由于刚转java项目,所以对于java语言比较陌生,尤其是lambda和一些诸如(一个java文件只能有一个public class)等等的零散知识点之类。。。
使我觉得就语言的层级来说。.net真的超越java不是一星半点。奈何.net跨平台晚,社区力量也小。
相交枚举而言。真的没有 .net中给枚举添加attrbuite来的方便。.net枚举:http://blog.csdn.net/hanjun0612/article/details/70807664
由于公司需要多语言,所以枚举中希望能增添额外的属性。
并且提供共同的操作方法。
下面给大家看一下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(); } //report public enum ReportEnum implements IEnumList { PS_6(0,"操作负责的客户数量及票数及损失率统计"), PS_7(1,"客户的需求反馈情况-分公司op"), ; private EnumItem item=new EnumItem(); ReportEnum(Integer key,String Value) { item.setKey(key); item.setVal(Value); } @Override public 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); } @Override public 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
测试运行
@Test public void testEnumList(){ //获取枚举的键值对(class) List<EnumItem> list= EnumUtil.getEnumList(EnumList.IsValidEnum.class); //获取枚举的键值对(class name) List<EnumItem> list1= EnumUtil.getEnumList("IsValidEnum"); //获取枚举 name,key,val EnumList.IsValidEnum[] list2 = EnumList.IsValidEnum.values(); //根据枚举类型和key获取信息 EnumItem item=EnumUtil.getEnumItem(EnumList.IsValidEnum.class,0); //根据枚举类型和value获取信息 EnumItem item1=EnumUtil.getEnumItem(EnumList.IsValidEnum.class,"无效"); }