在开发中不可避免会用到枚举值。
一:通过各个枚举类。二通过字典表。
管理某个微服务模块下所有枚举
定义baseEnum接口
public interface BaseEnum {
Integer getCode();
String getName();
}
多个枚举类并实现
import lombok.Getter;
@Getter
public enum LanguagesEnum implements BaseEnum {
JAVA(1,"java"),
C(2,"c"),
CPro(3,"C++")
;
private Integer code;
private String name;
LanguagesEnum(Integer code, String name) {
this.code = code;
this.name = name;
}
}
import lombok.Getter;
@Getter
public enum OpenCloseStatusEnum implements BaseEnum{
OPEN_STATUS(1,"开启"),
CLOSE_STATUS(2,"关闭")
;
private Integer code;
private String name;
OpenCloseStatusEnum(Integer code, String name) {
this.code = code;
this.name = name;
}
}
EnumManger管理类
用到了 reflections这个反射工具类。想具体了解的话可以看这个博客: https://blog.csdn.net/qq_36838191/article/details/80507206
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.11</version>
</dependency>
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import org.reflections.Reflections;
import org.reflections.scanners.SubTypesScanner;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
@Component
public class EnumManager {
/**
*某个元素格式是:<枚举类名,<code,codeName>>
*/
private static final Map<String,Map<Integer,String>>AllCodeMap = new HashMap<>();
/**某个元素格式是:<枚举类名,<codeName,code>>
* */
private static final Map<String,Map<String,Integer>>AllCodeNameMap = new HashMap<>();
public static Map<String,Map<Integer,String>> getAllCodeMap(){
return AllCodeMap;
}
/**通过code值获取codeName
* @param clazz 枚举类
* @param code 枚举类的code值
* @return
*/
public static String getCodeName(Class<? extends BaseEnum> clazz,Integer code){
if (Objects.isNull(clazz)){
return "";
}
return getCodeName(clazz.getSimpleName(),code);
}
private static String getCodeName(String clazz, Integer code) {
if (StrUtil.isBlank(clazz) || Objects.isNull(code)){
return "";
}
final Map<Integer, String> codeMap = AllCodeMap.get(clazz);
return codeMap.getOrDefault(code,"");
}
/**根据codeName 得到对应code
* @param clazz 枚举类
* @param codeName 枚举类中的codeName
* @return
*/
public static Integer getCodeByCodeName(Class<? extends BaseEnum> clazz,String codeName){
if (Objects.isNull(clazz)){
return 0;
}
return getCodeByCodeName(clazz.getSimpleName(),codeName);
}
public static Integer getCodeByCodeName(String clazz,String codeName){
if (StrUtil.isBlank(clazz) ||StrUtil.isBlank(codeName) ){
return 0;
}
final Map<String, Integer> codeNameMap = AllCodeNameMap.get(clazz);
return codeNameMap.get(codeName);
}
@PostConstruct
public void afterPropertiesSet(){
// 若是别的模块不引用的话,没什么问题
final Reflections reflections = new Reflections("com.example.demo.enums", new SubTypesScanner());
// 若是有别的模块使用( 上面这中写法,可能发布的时候,模块 无法打开jar包)
final Reflections reflections = new Reflections( ClasspathHelper.forClass(BaseEnum.class));
final Set<Class<? extends BaseEnum>> subTypesOf = reflections.getSubTypesOf(BaseEnum.class);
if (CollUtil.isEmpty(subTypesOf)){
return;
}
subTypesOf.forEach(base ->{
final BaseEnum[] enumConstants = base.getEnumConstants();
HashMap<Integer, String> codeMap = new HashMap<>();
HashMap<String, Integer> codeNameMap = new HashMap<>();
AllCodeMap.put(base.getSimpleName(),codeMap);
AllCodeNameMap.put(base.getSimpleName(),codeNameMap);
for (BaseEnum enumConstant : enumConstants) {
codeMap.put(enumConstant.getCode(),enumConstant.getName());
codeNameMap.put(enumConstant.getName(),enumConstant.getCode());
}
});
}
}
测试一下
@GetMapping("/testCode")
public void testEnumManager(){
Map<String, Map<Integer, String>> allCodeMap = EnumManager.getAllCodeMap();
String codeName = EnumManager.getCodeName(OpenCloseStatusEnum.class, 1);
Integer code = EnumManager.getCodeByCodeName(OpenCloseStatusEnum.class, "开启");
}
效果如下