【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);
    }
相关推荐
我怎么又饿了呀几秒前
DataWhale—量化金融(task8 最大回撤 和 仓位管理)
python·金融·量化
Black_Rock_br36 分钟前
打通 PyTorch Monarch 与 ROCm:单 Controller 架构的异构算力实战
人工智能·pytorch·python·开源
其实防守也摸鱼43 分钟前
Kimi K3深度测评:长文本之外的真实力
运维·开发语言·网络·人工智能·python·学习·安全
weixin_BYSJ19871 小时前
springboot3家政平台小程序--附源码00904
java·javascript·spring boot·python·django·flask·php
冻柠檬飞冰走茶1 小时前
PTA基础编程题目集 7-7 12-24小时制(C语言实现)
c语言·开发语言·数据结构·算法
风痕天际1 小时前
Pytorch开发教程1——CUDA安装
人工智能·pytorch·python
梦幻通灵1 小时前
Java中finally失效的几种情况【持续更新】
java·开发语言
月落归舟1 小时前
SpringMVC 多种响应返回方式
java·开发语言
吃饱了得干活1 小时前
JVM垃圾回收:从新生代到ZGC,从理论到调优
java·jvm·后端
长不胖的路人甲1 小时前
二叉排序树(BST)Java 完整实现 + 删除思路详解
java·开发语言·算法