java 枚举 封装操作方法
前言:由于刚转java项目,所以对于java语言比较陌生,尤其是lambda和一些诸如(一个java文件只能有一个public class)等等的零散知识点之类。。。使我觉得就语言的层级来说。.net真的超越java不是一星半点。奈何.net跨平台晚,社区力量也小。相交枚举而言。真的没有 .net中给枚举添加attrbuite来的方便。.net枚举:http://blog.csdn....
前言:
由于刚转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();
}
//report
public 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);
}
@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,"无效");
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)