枚举统一管理
定义接口
/**
* @Date: 2024/8/8 13:32
* 统一枚举接口
*/
public interface IEnum<K> {
/**
*
* @return K: 枚举 key
*/
K getCode();
}
枚举管理器
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Author: xiaodong.zheng
* @Date: 2024/8/8 13:34
* 枚举管理器
* @param K: 枚举key类型
* @param E: 枚举实例
*/
public class EnumManager<E extends IEnum<K>, K> {
private Map<K, E> map = new HashMap<>();
/**
* 枚举类型
*/
private Class<E> enumType;
public EnumManager(Class<E> enumType) {
this.enumType = enumType;
init();
}
private void init() {
for (E instance : enumType.getEnumConstants()) {
map.put(instance.getCode(), instance);
}
}
/**
* 根据 code 查询 枚举值
* @param code
* @return
*/
public Optional<E> fromCode(K code) {
return Optional.ofNullable(map.get(code));
}
private static Map<Class<?>, EnumManager<?, ?>> ALL_MAP = new ConcurrentHashMap<>();
/**
* 获取对应的枚举管理器
* @param enumType
* @return
* @param <E>
* @param <K>
*/
public static <E extends IEnum<K>, K> EnumManager<E, K> of(Class<E> enumType) {
return (EnumManager<E, K>) ALL_MAP.computeIfAbsent(enumType, type -> new EnumManager<E, K>((Class<E>) type));
}
}
测试
public enum Color implements IEnum<String> {
RED("red"),
GREEN("green"),
BLUE("blue");
private String code;
@Getter
private String name;
Color(String code) {
this.code = code;
this.name = "名称:" + code;
}
@Override
public String getCode() {
return code;
}
}
public enum StatusCode implements IEnum<Integer> {
SUCCESS(200, "success"),
ERROR(500, "error"), NOT_FOUND(404, "404");
@Getter
private Integer code;
@Getter
private String description;
StatusCode(Integer code, String description) {
this.code = code;
this.description = description;
}
@Override
public Integer getCode() {
return code;
}
}
public class EnumMain {
public static void main(String[] args) {
Optional<StatusCode> statusCode = EnumManager.of(StatusCode.class).fromCode(300);
if (statusCode.isPresent()){
System.out.println("exist");
}else {
System.out.println("not exist");
}
Optional<Color> yello = EnumManager.of(Color.class).fromCode("red");
if (yello.isPresent()){
System.out.println("exist");
}else {
System.out.println("not exist");
}
}
}
结果:
not exist
exist