管理某个模块下所有的枚举类

在开发中不可避免会用到枚举值。
一:通过各个枚举类。二通过字典表。

管理某个微服务模块下所有枚举

定义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, "开启");

    }

效果如下
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值