From 99adfecd1a45d4d78a108ea13c903afc6f67a388 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 25 Aug 2025 16:58:33 +0800 Subject: [PATCH] =?UTF-8?q?`EnumUtil`=E5=A2=9E=E5=8A=A0=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E6=94=AF=E6=8C=81=EF=BC=88pr#1376@Gitee=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/v7/core/cache/SimpleCache.java | 2 + .../java/cn/hutool/v7/core/util/EnumUtil.java | 75 +++++++++++++------ 2 files changed, 53 insertions(+), 24 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/cache/SimpleCache.java b/hutool-core/src/main/java/cn/hutool/v7/core/cache/SimpleCache.java index 12475f01b8..b315525d71 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/cache/SimpleCache.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/cache/SimpleCache.java @@ -23,6 +23,7 @@ import cn.hutool.v7.core.lang.mutable.Mutable; import cn.hutool.v7.core.lang.mutable.MutableObj; import cn.hutool.v7.core.map.reference.WeakConcurrentMap; +import java.io.Serial; import java.io.Serializable; import java.util.Iterator; import java.util.List; @@ -44,6 +45,7 @@ import java.util.stream.Collectors; * @author Looly, VampireAchao */ public class SimpleCache implements Iterable>, Serializable { + @Serial private static final long serialVersionUID = 1L; /** diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/util/EnumUtil.java b/hutool-core/src/main/java/cn/hutool/v7/core/util/EnumUtil.java index 0096226d96..d7d58765f7 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/util/EnumUtil.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/util/EnumUtil.java @@ -28,6 +28,7 @@ import cn.hutool.v7.core.text.StrUtil; import java.lang.reflect.Field; import java.lang.reflect.Type; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.function.Predicate; @@ -39,6 +40,15 @@ import java.util.function.Predicate; */ public class EnumUtil { + private static final Map, Enum[]> CACHE = new ConcurrentHashMap<>(); + + /** + * 清空缓存,重新加载枚举类 + */ + public static void clearCache() { + CACHE.clear(); + } + /** * 指定类是否为Enum类 * @@ -83,7 +93,7 @@ public class EnumUtil { if (null == enumClass) { return null; } - final E[] enumConstants = enumClass.getEnumConstants(); + final E[] enumConstants = getEnums(enumClass); if (index < 0) { index = enumConstants.length + index; } @@ -148,7 +158,6 @@ public class EnumUtil { * @param value 值 * @return 匹配到的枚举对象,未匹配到返回null */ - @SuppressWarnings("unchecked") public static > E likeValueOf(final Class enumClass, Object value) { if (null == enumClass || null == value) { return null; @@ -158,7 +167,7 @@ public class EnumUtil { } final Field[] fields = FieldUtil.getFields(enumClass); - final Enum[] enums = enumClass.getEnumConstants(); + final E[] enums = getEnums(enumClass); String fieldName; for (final Field field : fields) { fieldName = field.getName(); @@ -166,9 +175,9 @@ public class EnumUtil { // 跳过一些特殊字段 continue; } - for (final Enum enumObj : enums) { + for (final E enumObj : enums) { if (ObjUtil.equals(value, FieldUtil.getFieldValue(enumObj, field))) { - return (E) enumObj; + return enumObj; } } } @@ -178,19 +187,20 @@ public class EnumUtil { /** * 枚举类中所有枚举对象的name列表 * - * @param clazz 枚举类 + * @param enumClass 枚举类 * @return name列表 + * @param 枚举类型 */ - public static List getNames(final Class> clazz) { - if (null == clazz) { + public static > List getNames(final Class enumClass) { + if (null == enumClass) { return null; } - final Enum[] enums = clazz.getEnumConstants(); + final E[] enums = getEnums(enumClass); if (null == enums) { return null; } final List list = new ArrayList<>(enums.length); - for (final Enum e : enums) { + for (final E e : enums) { list.add(e.name()); } return list; @@ -199,20 +209,21 @@ public class EnumUtil { /** * 获得枚举类中各枚举对象下指定字段的值 * - * @param clazz 枚举类 + * @param enumClass 枚举类 * @param fieldName 字段名,最终调用getXXX方法 * @return 字段值列表 + * @param 枚举类型 */ - public static List getFieldValues(final Class> clazz, final String fieldName) { - if (null == clazz || StrUtil.isBlank(fieldName)) { + public static > List getFieldValues(final Class enumClass, final String fieldName) { + if (null == enumClass || StrUtil.isBlank(fieldName)) { return null; } - final Enum[] enums = clazz.getEnumConstants(); + final E[] enums = getEnums(enumClass); if (null == enums) { return null; } final List list = new ArrayList<>(enums.length); - for (final Enum e : enums) { + for (final E e : enums) { list.add(FieldUtil.getFieldValue(e, fieldName)); } return list; @@ -333,7 +344,7 @@ public class EnumUtil { if (null == enumClass || null == predicate) { return null; } - return Arrays.stream(enumClass.getEnumConstants()) + return Arrays.stream(getEnums(enumClass)) .filter(predicate).findAny().orElse(defaultEnum); } @@ -358,7 +369,7 @@ public class EnumUtil { if (Enum.class.equals(implClass)) { implClass = LambdaUtil.getRealClass(field); } - return Arrays.stream(implClass.getEnumConstants()) + return Arrays.stream(getEnums(implClass)) // 过滤 .filter(constant -> ObjUtil.equals(condition.apply(constant), value)) // 获取第一个并转换为结果 @@ -381,7 +392,7 @@ public class EnumUtil { return null; } final LinkedHashMap map = new LinkedHashMap<>(); - for (final E e : enumClass.getEnumConstants()) { + for (final E e : getEnums(enumClass)) { map.put(e.name(), e); } return map; @@ -391,18 +402,19 @@ public class EnumUtil { * 获得枚举名对应指定字段值的Map
* 键为枚举名,值为字段值 * - * @param clazz 枚举类 + * @param enumClass 枚举类 * @param fieldName 字段名,最终调用getXXX方法 * @return 枚举名对应指定字段值的Map + * @param 枚举类型 */ - public static Map getNameFieldMap(final Class> clazz, final String fieldName) { - if (null == clazz || StrUtil.isBlank(fieldName)) { + public static > Map getNameFieldMap(final Class enumClass, final String fieldName) { + if (null == enumClass || StrUtil.isBlank(fieldName)) { return null; } - final Enum[] enums = clazz.getEnumConstants(); - Assert.notNull(enums, "Class [{}] is not an Enum type!", clazz); + final E[] enums =getEnums(enumClass); + Assert.notNull(enums, "Class [{}] is not an Enum type!", enumClass); final Map map = MapUtil.newHashMap(enums.length, true); - for (final Enum e : enums) { + for (final E e : enums) { map.put(e.name(), FieldUtil.getFieldValue(e, fieldName)); } return map; @@ -457,4 +469,19 @@ public class EnumUtil { public static boolean equals(final Enum e, final String val) { return StrUtil.equals(toString(e), val); } + + /** + * 获取枚举类中的枚举值,调用过的枚举值会缓存,下次调用会从缓存中获取 + * + * @param 枚举类型 + * @param enumClass 枚举类 + * @return 枚举类中的枚举值 + */ + @SuppressWarnings("unchecked") + private static > E[] getEnums(final Class enumClass) { + if (null == enumClass) { + return null; + } + return (E[]) CACHE.computeIfAbsent(enumClass, (k) -> enumClass.getEnumConstants()); + } }