Sonnet 2021-11-18
项目实战枚举类进阶使用
个人对枚举类的理解,枚举就像是一个文件夹,里面装了同样的对象。类比一下枚举就是像是某天,里面有星期一、星期二、星期三…,他们都有共同的属性名称、code、要做的事等。
代码片
示例如下:
一、新建一个枚举类
public enum MyEnum {
// 下面是MyEnum里面包含的枚举
MONDAY("星期一", 1,"打羽毛球"),
TUESDAY("星期二", 2,"打王者荣耀"),
WEDNESDAY("星期三", 3,"去读书"),
THURSDAY("星期四", 4,"去游泳"),
FRIDAY("星期五", 5,"去北京"),
SATURDAY("星期六", 6,"去南京"),
SUNDAY("星期日", 7,"睡觉休息");
// 下面是MyEnum这个枚举里面的属性
private String name;
private Integer code;
private String thingToDo;
// 下面创建构造方法,get方法
MyEnum(String name, Integer code, String thingToDo) {
this.name = name;
this.code = code;
this.thingToDo = thingToDo;
}
public String getName() {
return name;
}
public Integer getCode() {
return code;
}
public String getThingToDo() {
return thingToDo;
}
//打印效果预览
public static void main(String[] args) {
for (MyEnum day : MyEnum.values()) {
System.out.println("name:" + day.name() +
",thingToDo:" + day.getThingToDo()+",code:"+day.getCode());
}
}
}
打印结果如下:
name:MONDAY,thingToDo:打羽毛球,code:1
name:TUESDAY,thingToDo:打王者荣耀,code:2
name:WEDNESDAY,thingToDo:去读书,code:3
name:THURSDAY,thingToDo:去游泳,code:4
name:FRIDAY,thingToDo:去北京,code:5
name:SATURDAY,thingToDo:去南京,code:6
name:SUNDAY,thingToDo:睡觉休息,code:7
二、结合接口设计共通方法,简化开发
思路:如果很多地方使用到需要数字和汉字转化,或者英文与数字的转化就可以将枚举写成共通方法;需要准备的工具有枚举工具类
、·枚举接口
,无数个枚举类实现枚举接口
;
2.1 工具类设计
package com.xxx.agiletc.util.Enums;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ReflectUtil;
import com.xxx.xxx.entity.LabelValueBean;
import com.xxx.xxx.entity.enums.BaseEnum;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**这里使用hutool工具包,一个非常使用的java开发工具包
* 枚举工具类
*/
public class MyEnumUtil {
public static <T extends BaseEnum<?>> T getByCode(String code, Class<T> enumClass) {
// 通过反射取出Enum所有常量的属性值
for (T each : enumClass.getEnumConstants()) {
// 利用code进行循环比较,获取对应的枚举
if (each.getCode().equals(code)) {
return each;
}
}
return null;
}
public static <T extends BaseEnum<?>> T getByValue(String value, Class<T> enumClass) {
// 通过反射取出Enum所有常量的属性值
for (T each : enumClass.getEnumConstants()) {
// 利用code进行循环比较,获取对应的枚举
if (each.getValue().equals(value)) {
return each;
}
}
return null;
}
public static <T extends BaseEnum<?>> List<LabelValueBean> allLabelValues(Class<T> enumClass) {
return ListUtil.toList(enumClass.getEnumConstants()).stream()
.map(value -> new LabelValueBean(value.getValue(), value.getCode())).collect(Collectors.toList());
}
public static List<Object> getFieldValues(Class<? extends Enum<?>> clazz, String fieldName) {
final Enum<?>[] enums = clazz.getEnumConstants();
if (null == enums) {
return null;
}
final List<Object> list = new ArrayList<>(enums.length);
for (Enum<?> e : enums) {
list.add(ReflectUtil.getFieldValue(e, fieldName));
}
return list;
}
public static <T extends BaseEnum<?>> List<String> allCodes(Class<T> enumClass) {
return ListUtil.toList(enumClass.getEnumConstants()).stream()
.map(value -> value.getCode()).collect(Collectors.toList());
}
public static <T extends BaseEnum<?>> List<Object> allValues(Class<T> enumClass) {
return ListUtil.toList(enumClass.getEnumConstants()).stream()
.map(value -> value.getValue()).collect(Collectors.toList());
}
}
2.2 枚举接口设计
//这里利用的设计模式思想是:是工厂模式
public interface BaseEnum<T> {
String getCode();
String getValue();
}
2.3 新建枚举类
package com.xxx.xxx.entity.enums.general;
import com.xxx.xxx.entity.enums.BaseEnum;
import org.apache.poi.ss.formula.functions.T;
/**
* 新建一个枚举类,里面的每一个枚举对象都有code,value两种属性
*/
public enum TestDemo implements BaseEnum<T> {
OVERALL_SITUATION("overall_situation","总体测试情况"),
RISK_CLOG("risk_clog","风险和阻塞问题"),
TOMORROW_PLAN("tomorrow_plan","明日工作计划"),
OVERALL_PROGRESS("overall_progress","整体进度汇总"),
DETAILED_PROGRESS("detailed_progress","详细测试进度"),
DEFECT_LIST("defect_list","缺陷列表"),
COMPATIBILITY_TEST("compatibility_test","兼容性测试覆盖");
private String code;
private String value;
TestDemo (String code, String value) {
this.code=code;
this.value=value;
}
@Override
public String getCode() {
return code;
}
@Override
public String getValue() {
return value;
}
}
}
2.4 使用工具类简化开发
//使用工具类可以快速翻译出某一个code对应的value
TestDemo byCode = MyEnumUtil.getByCode(m.getKey(), TestDemo.class);
String label = byCode.getValue();
String value = byCode.getCode();
//还可以通过工具类,快速翻译枚举的值
public Map<String, Object> getDataList(String className, String[] ignoreFieldName) {
Map<String, Object> data = new LinkedHashMap<String, Object>();
Set<Class<?>> classSet = ClassUtil.scanPackageBySuper("com.xxx.xxx.entity.enums", BaseEnum.class);
Optional<Class<?>> enumOptional = classSet.stream()
.filter(cls -> ClassUtil.getClassName(cls, true).equals(className)).findFirst();
if (enumOptional.isPresent()) {
Class enumClass = enumOptional.get();
List<LabelValueBean> dropDownBoxData = MyEnumUtil.allLabelValues(enumClass);
if(ignoreFieldName!=null){
List<String> ignoreFieldNameList = Arrays.asList(ignoreFieldName);
dropDownBoxData=dropDownBoxData.stream().filter(bean->!ignoreFieldNameList.contains(bean.getValue())).collect(Collectors.toList());
}
if (dropDownBoxData.size() > 0) {
data.put("enumOptions", dropDownBoxData);
}
}
return data;
}