【Java】枚举类映射

在数据库中常用数字来代替字符串类型,编写一个枚举映射类

当数据库的介质类型要存储数字,前端可以任意传参,通过枚举转换后端都会转成数字对应类型

import lombok.Getter;

/**
 * <p>
 * 存档介质类型
 * </p>
 *
 * @author Jyang
 * @date 2024/11/14
 */
@Getter
public enum ArchiveMediumTypeEnum implements DescriptiveEnum {

    PAPER(1, "纸质"),
    ELECTRONIC(2, "电子");

    private final int code;
    private final String desc;

    ArchiveMediumTypeEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    @Override
    public int getCode() {
        return code;
    }

    @Override
    public String getDesc() {
        return desc;
    }
}



/**
 * <p>
 * 适用于数据库存储的描述性枚举
 * </p>
 *
 * @author Jyang
 * @date 2024/11/14
 */

public interface DescriptiveEnum {

    /**
     * 编码
     */
    int getCode();
    /**
     * 描述
     */
    String getDesc();
}





import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;


/**
 * <p>
 * 枚举转换
 * </p>
 *
 * @author Jyang
 * @date 2024/11/14
 */

public class DescriptiveEnumConverter<T extends Enum<T> & DescriptiveEnum> {

    /**
     * key:code
     * value:泛型枚举
     */
    private final Map<Integer, T> codeToEnum = new HashMap<>();
    /**
     * key:描述信息
     * value:泛型枚举
     */
    private final Map<String, T> descToEnum = new HashMap<>();

    /**
     * 使用Map存储作为单例模式
     */
    private static final Map<Class<?>, DescriptiveEnumConverter<?>> CACHE = new ConcurrentHashMap<>();

    public static <T extends Enum<T> & DescriptiveEnum> DescriptiveEnumConverter<T> of(Class<T> enumClass) {
        return (DescriptiveEnumConverter<T>) CACHE.computeIfAbsent(
                enumClass,
                (Class<?> k) -> new DescriptiveEnumConverter<>(enumClass)
        );
    }

    public DescriptiveEnumConverter(Class<T> enumClass) {
        for (T enumConstant : enumClass.getEnumConstants()) {
            codeToEnum.put(enumConstant.getCode(), enumConstant);
            descToEnum.put(enumConstant.getDesc(), enumConstant);
        }
    }

    /**
     * 根据编码获取描述
     *
     * @param code 编码
     * @return
     */
    public String getDescByCode(Integer code) {
        return codeToEnum.get(code).getDesc();
    }

    /**
     * 根据描述获取编码
     *
     * @param desc 描述
     * @return
     */
    public Integer getCodeByDesc(String desc) {
        return descToEnum.get(desc).getCode();
    }

    /**
     * 统一返回编码
     *
     * @param codeOrDesc 编码或者描述
     * @return 编码
     */
    public Integer getCode(Object codeOrDesc) {
        return Optional.ofNullable(codeToEnum.get(codeOrDesc))
                .orElseGet(() -> descToEnum.get(codeOrDesc)).getCode();
    }

    /**
     * 统一返回描述
     *
     * @param codeOrDesc 编码或者描述
     * @return 描述
     */
    public String getDesc(Object codeOrDesc) {
        return Optional.ofNullable(codeToEnum.get(codeOrDesc))
                .orElseGet(() -> descToEnum.get(codeOrDesc)).getDesc();
    }

    /**
     * 根据编码获取枚举
     *
     * @param code 编码
     * @return 枚举
     */
    public T fromCode(Integer code) {
        return codeToEnum.get(code);
    }

    /**
     * 根据描述获取类型
     *
     * @param desc 描述
     * @return 枚举
     */
    public T fromDesc(String desc) {
        return descToEnum.get(desc);
    }

    /**
     * 根据枚举获取编码
     *
     * @param enumValue 枚举
     * @return 编码
     */
    public Integer toCode(T enumValue) {
        return Optional.ofNullable(enumValue)
                .map(DescriptiveEnum::getCode)
                .orElse(null);
    }

    /**
     * 根据枚举获取描述
     *
     * @param enumValue 枚举
     * @return 描述
     */
    public String toDesc(T enumValue) {
        return Optional.ofNullable(enumValue)
                .map(DescriptiveEnum::getDesc)
                .orElse(null);
    }
}

    /**
     * 使用方式
     * 
     * @param args
     */
    public static void main(String[] args) {
        /**
         * 根据编码或者描述统一返回编码
         */
        Integer code1 = DescriptiveEnumConverter.of(ArchiveMediumTypeEnum.class).getCode(1);
        System.out.println("code1 = " + code1);
        Integer code2 = DescriptiveEnumConverter.of(ArchiveMediumTypeEnum.class).getCode("纸质");
        System.out.println("code2 = " + code2);

        /**
         * 根据编码或者描述统一返回描述信息
         */
        String desc1 = DescriptiveEnumConverter.of(ArchiveMediumTypeEnum.class).getDesc(2);
        System.out.println("desc = " + desc1);
        String desc2 = DescriptiveEnumConverter.of(ArchiveMediumTypeEnum.class).getDesc("电子");
        System.out.println("desc = " + desc2);

        /**
         * 根据枚举返回编码
         */
        Integer toCode = DescriptiveEnumConverter.of(ArchiveMediumTypeEnum.class).toCode(ArchiveMediumTypeEnum.PAPER);
        String toDesc = DescriptiveEnumConverter.of(ArchiveMediumTypeEnum.class).toDesc(ArchiveMediumTypeEnum.ELECTRONIC);
    }
相关推荐
Cachel wood几秒前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Code哈哈笑3 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
終不似少年遊*6 分钟前
pyecharts
python·信息可视化·数据分析·学习笔记·pyecharts·使用技巧
gb42152876 分钟前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶7 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
Python之栈7 分钟前
【无标题】
数据库·python·mysql
qq_433618449 分钟前
shell 编程(二)
开发语言·bash·shell
zfoo-framework14 分钟前
【jenkins插件】
java
风_流沙20 分钟前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch