前言
使用 工厂模式根据传入参的类名,获取下拉框数据 。
1. 枚举接口
package com.cj.entity.enums;
public interface BaseEnum<T> {
String getCode();
String getValue();
}
2. 普通枚举类
所有的普通的枚举类:
1.必须在包 com.cj.entity.enums.general下
2.必须实现BaseEnum接口
package com.cj.entity.enums.general;
import com.com.cj.entity.enums.BaseEnum;
import org.apache.poi.ss.formula.functions.T;
/**
* 测试状态
*/
public enum TestState implements BaseEnum<T> {
UN_TEST("unTest","待分析"),
FINISH("finish","完成");
private String code;
private String value;
TestState (String code, String value) {
this.code=code;
this.value=value;
}
@Override
public String getCode() {
return code;
}
@Override
public String getValue() {
return value;
}
}
3. MyEnumUtil工具类
package com.cj.util.Enums;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ReflectUtil;
import com.cj.entity.LabelValueBean;
import com.cj.entity.enums.BaseEnum;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 枚举工具类
*/
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());
}
}
4. 根据枚举名,获取下拉框数据
package com.cj.service.impl.common;
import cn.hutool.core.util.ClassUtil;
import com.cj.entity.LabelValueBean;
import com.cj.entity.enums.BaseEnum;
import com.cj.service.common.GlobalCommonService;
import com.cj.util.Enums.MyEnumUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Service
@Transactional
public class GlobalCommonServiceImpl implements GlobalCommonService {
@Override
public Map<String, Object> getDropDownBoxData(String className, String[] ignoreFieldName) {
Map<String, Object> data = new LinkedHashMap<String, Object>();
Set<Class<?>> classSet = ClassUtil.scanPackageBySuper("com.cj.entity.enums.general", 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;
}
}
5. 下拉框数据类
package com.cj.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 下拉框数据结构
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LabelValueBean implements Comparable{
Object label;
Object value;
// 实现 Comparable 接口的抽象方法,定义排序规则
@Override
public int compareTo(Object o){
LabelValueBean bean = (LabelValueBean)o;
// 升序排列,反之降序
return String.valueOf(this.label).compareTo(String.valueOf(bean.label));
}
//重写equals
@Override
public boolean equals(Object o){
if(o instanceof LabelValueBean){
if(this.value == ((LabelValueBean)o).value){
return true;
}
}
return false;
}
}