【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);
    }
相关推荐
怒放吧德德13 小时前
Spring Boot 实战:RSA+AES 接口全链路加解密(防篡改 / 防重放)
java·spring boot·后端
郑州光合科技余经理16 小时前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo12317 小时前
matlab画图工具
开发语言·matlab
大大水瓶17 小时前
Tomcat
java·tomcat
dustcell.17 小时前
haproxy七层代理
java·开发语言·前端
norlan_jame17 小时前
C-PHY与D-PHY差异
c语言·开发语言
游离态指针17 小时前
以为发消息=下单成功?RabbitMQ从0到秒杀实战的完整踩坑笔记
java
多恩Stone17 小时前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
BD_Marathon17 小时前
工厂方法模式
android·java·工厂方法模式
QQ40220549618 小时前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django