mirror of
https://gitee.com/dromara/hutool.git
synced 2025-10-07 07:04:40 +08:00
EnumUtil
增加缓存支持(pr#1376@Gitee)
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
* 【extra 】 `getClientIP`优先获取传入的请求头信息(pr#1373@Gitee)
|
||||
* 【db 】 增加`Gbase8s`驱动支持(issue#ICSFAM@Gitee)
|
||||
* 【db 】 增加TDSQL PostgreSQL版本、TDSQL-H LibraDB、Snowflake、Teradata 的驱动支持(pr#4024@Github)
|
||||
* 【core 】 `EnumUtil`增加缓存支持(pr#1376@Gitee)
|
||||
|
||||
### 🐞Bug修复
|
||||
* 【extra 】 `Sftp``reconnectIfTimeout`方法改为捕获所有异常(issue#3989@Github)
|
||||
|
@@ -20,6 +20,15 @@ import java.util.function.Predicate;
|
||||
*/
|
||||
public class EnumUtil {
|
||||
|
||||
private static final Map<Class<?>, Enum<?>[]> CACHE = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* 清空缓存,重新加载枚举类
|
||||
*/
|
||||
public static void clearCache() {
|
||||
CACHE.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* 指定类是否为Enum类
|
||||
*
|
||||
@@ -64,7 +73,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;
|
||||
}
|
||||
@@ -128,7 +137,6 @@ public class EnumUtil {
|
||||
* @param value 值
|
||||
* @return 匹配到的枚举对象,未匹配到返回null
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <E extends Enum<E>> E likeValueOf(Class<E> enumClass, Object value) {
|
||||
if (null == enumClass || null == value) {
|
||||
return null;
|
||||
@@ -138,7 +146,7 @@ public class EnumUtil {
|
||||
}
|
||||
|
||||
final Field[] fields = ReflectUtil.getFields(enumClass);
|
||||
final Enum<?>[] enums = enumClass.getEnumConstants();
|
||||
final E[] enums = getEnums(enumClass);
|
||||
String fieldName;
|
||||
for (Field field : fields) {
|
||||
fieldName = field.getName();
|
||||
@@ -146,9 +154,9 @@ public class EnumUtil {
|
||||
// 跳过一些特殊字段
|
||||
continue;
|
||||
}
|
||||
for (Enum<?> enumObj : enums) {
|
||||
for (E enumObj : enums) {
|
||||
if (ObjectUtil.equal(value, ReflectUtil.getFieldValue(enumObj, field))) {
|
||||
return (E) enumObj;
|
||||
return enumObj;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -165,7 +173,7 @@ public class EnumUtil {
|
||||
if (null == clazz) {
|
||||
return null;
|
||||
}
|
||||
final Enum<?>[] enums = clazz.getEnumConstants();
|
||||
final Enum<?>[] enums = getEnums2(clazz);
|
||||
if (null == enums) {
|
||||
return null;
|
||||
}
|
||||
@@ -187,7 +195,7 @@ public class EnumUtil {
|
||||
if (null == clazz || StrUtil.isBlank(fieldName)) {
|
||||
return null;
|
||||
}
|
||||
final Enum<?>[] enums = clazz.getEnumConstants();
|
||||
final Enum<?>[] enums = getEnums2(clazz);
|
||||
if (null == enums) {
|
||||
return null;
|
||||
}
|
||||
@@ -257,13 +265,10 @@ public class EnumUtil {
|
||||
return null;
|
||||
}
|
||||
|
||||
Enum<?>[] constants = CACHE.computeIfAbsent(enumClass, k -> enumClass.getEnumConstants());
|
||||
return Arrays.stream((E[]) constants)
|
||||
return Arrays.stream(getEnums(enumClass))
|
||||
.filter(predicate).findFirst().orElse(defaultEnum);
|
||||
}
|
||||
|
||||
private static final Map<Class<?>, Enum<?>[]> CACHE = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* 通过 某字段对应值 获取 枚举,获取不到时为 {@code null}
|
||||
* <p>
|
||||
@@ -351,7 +356,7 @@ public class EnumUtil {
|
||||
return null;
|
||||
}
|
||||
final Class<E> implClass = LambdaUtil.getRealClass(field);
|
||||
return Arrays.stream(implClass.getEnumConstants())
|
||||
return Arrays.stream(getEnums(implClass))
|
||||
// 过滤
|
||||
.filter(constant -> ObjUtil.equals(condition.apply(constant), value))
|
||||
// 获取第一个并转换为结果
|
||||
@@ -374,7 +379,7 @@ public class EnumUtil {
|
||||
return null;
|
||||
}
|
||||
final LinkedHashMap<String, E> map = new LinkedHashMap<>();
|
||||
for (final E e : enumClass.getEnumConstants()) {
|
||||
for (final E e : getEnums(enumClass)) {
|
||||
map.put(e.name(), e);
|
||||
}
|
||||
return map;
|
||||
@@ -392,7 +397,7 @@ public class EnumUtil {
|
||||
if (null == clazz || StrUtil.isBlank(fieldName)) {
|
||||
return null;
|
||||
}
|
||||
final Enum<?>[] enums = clazz.getEnumConstants();
|
||||
final Enum<?>[] enums = getEnums2(clazz);
|
||||
if (null == enums) {
|
||||
return null;
|
||||
}
|
||||
@@ -452,4 +457,29 @@ public class EnumUtil {
|
||||
public static boolean equals(final Enum<?> e, String val) {
|
||||
return StrUtil.equals(toString(e), val);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取枚举类中的枚举值,调用过的枚举值会缓存,下次调用会从缓存中获取
|
||||
*
|
||||
* @param <E> 枚举类型
|
||||
* @param enumClass 枚举类
|
||||
* @return 枚举类中的枚举值
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private static <E extends Enum<E>> E[] getEnums(final Class<E> enumClass) {
|
||||
return (E[]) getEnums2(enumClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取枚举类中的枚举值,调用过的枚举值会缓存,下次调用会从缓存中获取
|
||||
*
|
||||
* @param enumClass 枚举类
|
||||
* @return 枚举类中的枚举值
|
||||
*/
|
||||
private static Enum<?>[] getEnums2(final Class<? extends Enum<?>> enumClass) {
|
||||
if (null == enumClass) {
|
||||
return null;
|
||||
}
|
||||
return CACHE.computeIfAbsent(enumClass, (k) -> enumClass.getEnumConstants());
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user