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()); + } }