2021-11-18 项目实战枚举类进阶使用

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;
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值