在数据库中常用数字来代替字符串类型,编写一个枚举映射类
当数据库的介质类型要存储数字,前端可以任意传参,通过枚举转换后端都会转成数字对应类型
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);
}