【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);
    }
相关推荐
我叫黑大帅2 分钟前
add()和 __add__() 写法哪个更好呢?
后端·python·面试
不如语冰4 分钟前
AI大模型入门-Python进阶-上下文管理与with语句
开发语言·数据结构·数据库·人工智能·pytorch·redis·python
M1A110 分钟前
基于 Spring AOP 构建系统操作日志:从注解设计到异步落库的完整实战
java
柠檬味的Cat11 分钟前
GEO优化系统哪个渠道商好
大数据·人工智能·python
RainCity22 分钟前
Java Swing 自定义组件库分享(十五)
java·笔记·后端
farerboy27 分钟前
23-Java 构造函数
java·后端
青春不败 177-3266-052033 分钟前
基于Python实现的深度学习技术在水文水质领域应用
python·深度学习·机器学习·水文水资源·水质模型
坚持的小马37 分钟前
Rocketmq搭建操作步骤
java·rocketmq·java-rocketmq
阿童木写作1 小时前
Python批量翻译亚马逊商品图实战教程
开发语言·python·xcode
砚底藏山河1 小时前
多家股票数据接口对比、企业级股票数据API
java·python·金融·maven