Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 372d8f8

Browse files
committed
feat: 通过全局缓存来优化每次都需要通过反射获取枚举对象 预估时间消耗减少到1/20到1/10 同时使用ConcurrentHashMap来避免并发问题 考虑到工具类应该也不会有那么高的并发需求 其实也可以使用普通map
1 parent f6ba182 commit 372d8f8

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

hutool-core/src/main/java/cn/hutool/core/util/EnumUtil.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import java.lang.reflect.Field;
1010
import java.util.*;
11+
import java.util.concurrent.ConcurrentHashMap;
1112
import java.util.function.Function;
1213
import java.util.function.Predicate;
1314

@@ -243,6 +244,7 @@ public static <E extends Enum<E>> E getBy(Class<E> enumClass, Predicate<? super
243244

244245
/**
245246
* 通过 某字段对应值 获取 枚举,获取不到时为 {@code defaultEnum}
247+
* 通过缓存减少反射带来的影响
246248
*
247249
* @param enumClass 枚举类
248250
* @param predicate 条件
@@ -254,10 +256,14 @@ public static <E extends Enum<E>> E getBy(Class<E> enumClass, Predicate<? super
254256
if (null == enumClass || null == predicate) {
255257
return null;
256258
}
257-
return Arrays.stream(enumClass.getEnumConstants())
259+
260+
Enum<?>[] constants = CACHE.computeIfAbsent(enumClass, k -> enumClass.getEnumConstants());
261+
return Arrays.stream((E[]) constants)
258262
.filter(predicate).findFirst().orElse(defaultEnum);
259263
}
260264

265+
private static final Map<Class<?>, Enum<?>[]> CACHE = new ConcurrentHashMap<>();
266+
261267
/**
262268
* 通过 某字段对应值 获取 枚举,获取不到时为 {@code null}
263269
* <p>

0 commit comments

Comments
 (0)