【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);
    }
相关推荐
考虑考虑5 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯6 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
金銀銅鐵7 小时前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
Lyn_Li9 小时前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测
青石路10 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
像我这样帅的人丶你还13 小时前
Java 后端详解(五):Redis 缓存
java·后端·全栈
小九九的爸爸13 小时前
前端想要入门Agent开发,要具备哪些Python基础?
python·agent·ai编程
阿耶同学14 小时前
手把手教你用 LangGraph 搭建三层嵌套 Agent 架构
python·程序员
plainGeekDev15 小时前
GreenDAO → Room
android·java·kotlin
亦暖筑序20 小时前
Java 8老系统AI Workflow实战:把一次性AI对话升级成可恢复工作流
java·后端