Skip to main content

枚举的组合和接口实现

问题描述

项目最初定义了一个枚举类,几乎是把所有类型的枚举全部放到这个类里面,类似下面这种,通过type区分枚举的类型,初期这么设计,应该是为了对外提供一个字典查询的接口。后面的问题,当然就是这个类越来越大,于是打算拆分。

public enum AllDicEnum {
DOG(1, "🐕", "animal"),
CAT(2,"neko","animal"),
APPLE(1, "苹果", "fruit");
private final int value;
private final String name;
private final String type;

public static List<AllDicEnum> findByType(String type) {
List<AllDicEnum> list = new ArrayList<>();
for (AllDicEnum allDicEnum : values()) {
if (allDicEnum.type.equals(type)) {
list.add(allDicEnum);
}
}
return list;
}
}

思路

  1. 首先,把枚举类拆分成多个,比如,animal,fruit,plant等。
  2. 想保证拆分出来的枚举的字段自由定义。

解决

  1. 创建接收枚举的对象
@Data
public class DicEnumVO {
private Object value;
private String name;
}
  1. 定义接口,通过code和desc生成枚举VO
public interface DicEnumInterface {

Object getCode();

String getDesc();

default DicEnumVO getResourceDicStrVO() {
DicEnumVO resourceDicVO = new DicEnumVO();
resourceDicVO.setValue(getCode());
resourceDicVO.setName(getDesc());
return resourceDicVO;
}


static <E extends DicEnumInterface> List<DicEnumVO> getDicVO(Class<E> enumClass) {
List<DicEnumVO> list = new ArrayList<>();
for (E enumConstant : enumClass.getEnumConstants()) {
DicEnumVO resourceDicStrVO = enumConstant.getResourceDicStrVO();
if (resourceDicStrVO != null)
list.add(resourceDicStrVO);
}
return list;
}
}

  1. 将枚举类拆分并实现DicEnumInterface,可以自由定义字段,只要实现getCodegetDesc,或者重写getResourceDicStrVO
@Getter
public enum AnimalEnum implements DicEnumInterface{

DOG(1, "🐕"),
CAT(2,"neko"),
;

private final int value;
private final String name;

AnimalEnum(int value, String name) {
this.value = value;
this.name = name;
}

@Override
public Object getCode() {
return this.value;
}

@Override
public String getDesc() {
return this.name;
}
}

  1. 最后统一收集拆分出来的枚举
@Getter
public enum AllDicEnum {

animal("animal","动物",AnimalEnum.class)
;
/* 字典类型 */
private final String type;
private final String desc;
private final Class<? extends DicEnumInterface> dicEnumInterface;

AllDicEnum(String type, String desc, Class<? extends DicEnumInterface> dicEnumInterface) {
this.type = type;
this.desc = desc;
this.dicEnumInterface = dicEnumInterface;
}

public static List<DicEnumVO> findByType(String type) {
List<DicEnumVO> list = new ArrayList<>();
for (AllDicEnum allDicEnum : values()) {
if (allDicEnum.getType().equals(type)) {
list = DicEnumInterface.getDicVo(allDicEnum.getDicEnumInterface());
} else if (type.equals("all")) {
list.addAll(DicEnumInterface.getDicVo(allDicEnum.getDicEnumInterface()));
}
}
return list;
}

public static void main(String[] args) {
System.out.println(findByType("animal"));
}
}