Spring Boot 2.7.18(最终 2.x 系列版本)3 - 枚举规范定义:定义基础枚举接口;定义枚举工具类;示例枚举
- Spring Boot 2.7.18(最终 2.x 系列版本)3 - 统一异常处理
Spring Boot 2.7.18(最终 2.x 系列版本)3 - 统一异常处理
定义基础枚举接口
package cn.hao.kai.enums;import java.io.Serializable;
@SuppressWarnings("unused")
public interface IBaseEnum<V> extends Serializable {V getEnumCode();String getEnumDescription();
}
定义枚举工具类
package cn.hao.kai.enums;import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
@SuppressWarnings("unused")
public final class EnumUtil {private static final Map<Class<?>, Map<Object, Enum<?>>> ENUM_CODE_CACHE = new ConcurrentHashMap<>();private static final Map<Class<?>, Map<String, Enum<?>>> ENUM_DESC_CACHE = new ConcurrentHashMap<>();private EnumUtil() {throw new UnsupportedOperationException("EnumUtil is a utility class and cannot be instantiated.");}@SuppressWarnings("unchecked")public static <E extends Enum<E> & IBaseEnum<V>, V> E getEnumByEnumCode(Class<E> enumClass, V enumCode) {if (enumClass == null || enumCode == null) return null;return (E) ENUM_CODE_CACHE.computeIfAbsent(enumClass, EnumUtil::initValueCache).get(enumCode);}public static <E extends Enum<E>> E getEnumByEnumName(Class<E> enumClass, String enumName) {if (enumClass == null || enumName == null) return null;try {return Enum.valueOf(enumClass, enumName);} catch (IllegalArgumentException e) {return null;}}@SuppressWarnings("unchecked")public static <E extends Enum<E> & IBaseEnum<?>> E getEnumByEnumDescription(Class<E> enumClass, String enumDescription) {if (enumClass == null || enumDescription == null) return null;return (E) ENUM_DESC_CACHE.computeIfAbsent(enumClass, EnumUtil::initDescriptionCache).get(enumDescription);}public static <E extends Enum<E> & IBaseEnum<?>> E getByCondition(Class<E> enumClass, Predicate<E> predicate) {for (E e : enumClass.getEnumConstants()) {if (predicate.test(e)) return e;}return null;}public static <E extends Enum<E> & IBaseEnum<V>, V> boolean existsEnumCode(Class<E> enumClass, V enumCode) {return getEnumByEnumCode(enumClass, enumCode) != null;}public static <E extends Enum<E>> boolean existsEnumName(Class<E> enumClass, String enumName) {return getEnumByEnumName(enumClass, enumName) != null;}public static <E extends Enum<E> & IBaseEnum<?>> boolean existsEnumDescription(Class<E> enumClass, String enumDescription) {return getEnumByEnumDescription(enumClass, enumDescription) != null;}public static <E extends Enum<E> & IBaseEnum<?>> List<Map<String, Object>> toList(Class<E> enumClass,String codeKey,String descriptionKey) {List<Map<String, Object>> list = new ArrayList<>();for (E e : enumClass.getEnumConstants()) {Map<String, Object> map = new LinkedHashMap<>();map.put(codeKey, e.getEnumCode());map.put(descriptionKey, e.getEnumDescription());list.add(map);}return list;}public static <E extends Enum<E> & IBaseEnum<?>> List<Map<String, Object>> toDropdownList(Class<E> enumClass,String valueKey,String labelKey) {return toList(enumClass, valueKey, labelKey);}@SuppressWarnings("unchecked")private static Map<Object, Enum<?>> initValueCache(Class<?> enumClass) {Map<Object, Enum<?>> map = new HashMap<>();for (Enum<?> e : ((Class<? extends Enum<?>>) enumClass).getEnumConstants()) {IBaseEnum<?> base = (IBaseEnum<?>) e;map.put(base.getEnumCode(), e);}return map;}@SuppressWarnings("unchecked")private static Map<String, Enum<?>> initDescriptionCache(Class<?> enumClass) {Map<String, Enum<?>> map = new HashMap<>();for (Enum<?> e : ((Class<? extends Enum<?>>) enumClass).getEnumConstants()) {IBaseEnum<?> base = (IBaseEnum<?>) e;map.put(base.getEnumDescription(), e);}return map;}public static void main(String[] args) {System.out.println("== getEnumByEnumCode: " + getEnumByEnumCode(ExampleEnum.class, 0));System.out.println("== getEnumByEnumName: " + getEnumByEnumName(ExampleEnum.class, "FAIL")); System.out.println("== getEnumByEnumDescription: " + getEnumByEnumDescription(ExampleEnum.class, "成功")); System.out.println("== existsEnumCode: " + existsEnumCode(ExampleEnum.class, 1)); System.out.println("== existsEnumName: " + existsEnumName(ExampleEnum.class, "SUCCESS")); System.out.println("== existsEnumDescription: " + existsEnumDescription(ExampleEnum.class, "失败")); System.out.println("== getByCondition: " + getByCondition(ExampleEnum.class, e -> e.getEnumCode() == 1)); System.out.println("== toList: " + toList(ExampleEnum.class, "code", "desc")); System.out.println("== toDropdownList: " + toDropdownList(ExampleEnum.class, "value", "label")); }}
示例枚举
package cn.hao.kai.enums;import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum ExampleEnum implements IBaseEnum<Integer> {SUCCESS(0, "成功"),FAIL(1, "失败");private final Integer code;private final String desc;@JsonIgnore@Overridepublic Integer getEnumCode() {return code;}@JsonIgnore@Overridepublic String getEnumDescription() {return desc;}
}