diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java b/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java
index a405e36a0..f36174bfb 100644
--- a/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java
+++ b/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java
@@ -61,7 +61,6 @@ import java.time.temporal.TemporalAccessor;
import java.util.Calendar;
import java.util.Collection;
import java.util.Currency;
-import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
@@ -81,27 +80,34 @@ import java.util.concurrent.atomic.AtomicReference;
*
* 在此类中,存放着默认转换器和自定义转换器,默认转换器是Hutool中预定义的一些转换器,自定义转换器存放用户自定的转换器。
*
- *
- * @author Looly
*
+ * @author Looly
*/
-public class ConverterRegistry implements Serializable{
+public class ConverterRegistry implements Serializable {
private static final long serialVersionUID = 1L;
- /** 默认类型转换器 */
+ /**
+ * 默认类型转换器
+ */
private Map> defaultConverterMap;
- /** 用户自定义类型转换器 */
+ /**
+ * 用户自定义类型转换器
+ */
private volatile Map> customConverterMap;
- /** 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载 */
+ /**
+ * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
+ */
private static class SingletonHolder {
- /** 静态初始化器,由JVM来保证线程安全 */
+ /**
+ * 静态初始化器,由JVM来保证线程安全
+ */
private static final ConverterRegistry INSTANCE = new ConverterRegistry();
}
/**
* 获得单例的 {@link ConverterRegistry}
- *
+ *
* @return {@link ConverterRegistry}
*/
public static ConverterRegistry getInstance() {
@@ -111,27 +117,28 @@ public class ConverterRegistry implements Serializable{
public ConverterRegistry() {
defaultConverter();
putCustomBySpi();
-
-
}
- @SuppressWarnings("rawtypes")
+ /**
+ * 使用SPI加载转换器
+ */
private void putCustomBySpi() {
- List list = ServiceLoaderUtil.loadList(Converter.class);
- list.forEach(converter->{
+ ServiceLoaderUtil.load(Converter.class).forEach(converter -> {
try {
Type type = TypeUtil.getTypeArgument(ClassUtil.getClass(converter));
- putCustom(type, converter);
+ if(null != type){
+ putCustom(type, converter);
+ }
} catch (Exception e) {
- // 忽略注册失败的
+ // 忽略注册失败的
}
});
}
/**
* 登记自定义转换器
- *
- * @param type 转换的目标类型
+ *
+ * @param type 转换的目标类型
* @param converterClass 转换器类,必须有默认构造方法
* @return {@link ConverterRegistry}
*/
@@ -141,8 +148,8 @@ public class ConverterRegistry implements Serializable{
/**
* 登记自定义转换器
- *
- * @param type 转换的目标类型
+ *
+ * @param type 转换的目标类型
* @param converter 转换器
* @return {@link ConverterRegistry}
*/
@@ -160,10 +167,9 @@ public class ConverterRegistry implements Serializable{
/**
* 获得转换器
- *
- * @param 转换的目标类型
- *
- * @param type 类型
+ *
+ * @param 转换的目标类型
+ * @param type 类型
* @param isCustomFirst 是否自定义转换器优先
* @return 转换器
*/
@@ -185,8 +191,8 @@ public class ConverterRegistry implements Serializable{
/**
* 获得默认转换器
- *
- * @param 转换的目标类型(转换器转换到的类型)
+ *
+ * @param 转换的目标类型(转换器转换到的类型)
* @param type 类型
* @return 转换器
*/
@@ -197,9 +203,8 @@ public class ConverterRegistry implements Serializable{
/**
* 获得自定义转换器
- *
- * @param 转换的目标类型(转换器转换到的类型)
- *
+ *
+ * @param 转换的目标类型(转换器转换到的类型)
* @param type 类型
* @return 转换器
*/
@@ -210,11 +215,11 @@ public class ConverterRegistry implements Serializable{
/**
* 转换值为指定类型
- *
- * @param 转换的目标类型(转换器转换到的类型)
- * @param type 类型目标
- * @param value 被转换值
- * @param defaultValue 默认值
+ *
+ * @param 转换的目标类型(转换器转换到的类型)
+ * @param type 类型目标
+ * @param value 被转换值
+ * @param defaultValue 默认值
* @param isCustomFirst 是否自定义转换器优先
* @return 转换后的值
* @throws ConvertException 转换器不存在
@@ -231,9 +236,9 @@ public class ConverterRegistry implements Serializable{
if (TypeUtil.isUnknow(type)) {
type = defaultValue.getClass();
}
-
- if(type instanceof TypeReference) {
- type = ((TypeReference>)type).getType();
+
+ if (type instanceof TypeReference) {
+ type = ((TypeReference>) type).getType();
}
// 标准转换器
@@ -251,18 +256,18 @@ public class ConverterRegistry implements Serializable{
return (T) value;
}
}
-
+
// 特殊类型转换,包括Collection、Map、强转、Array等
final T result = convertSpecial(type, rowType, value, defaultValue);
if (null != result) {
return result;
}
-
+
// 尝试转Bean
if (BeanUtil.isBean(rowType)) {
return new BeanConverter(type).convert(value, defaultValue);
}
-
+
// 无法转换
throw new ConvertException("No Converter for type [{}]", rowType.getName());
}
@@ -270,10 +275,10 @@ public class ConverterRegistry implements Serializable{
/**
* 转换值为指定类型
* 自定义转换器优先
- *
- * @param 转换的目标类型(转换器转换到的类型)
- * @param type 类型
- * @param value 值
+ *
+ * @param 转换的目标类型(转换器转换到的类型)
+ * @param type 类型
+ * @param value 值
* @param defaultValue 默认值
* @return 转换后的值
* @throws ConvertException 转换器不存在
@@ -284,9 +289,9 @@ public class ConverterRegistry implements Serializable{
/**
* 转换值为指定类型
- *
- * @param 转换的目标类型(转换器转换到的类型)
- * @param type 类型
+ *
+ * @param 转换的目标类型(转换器转换到的类型)
+ * @param type 类型
* @param value 值
* @return 转换后的值,默认为null
* @throws ConvertException 转换器不存在
@@ -296,20 +301,21 @@ public class ConverterRegistry implements Serializable{
}
// ----------------------------------------------------------- Private method start
+
/**
* 特殊类型转换
* 包括:
- *
+ *
*
* Collection
* Map
* 强转(无需转换)
* 数组
*
- *
- * @param 转换的目标类型(转换器转换到的类型)
- * @param type 类型
- * @param value 值
+ *
+ * @param 转换的目标类型(转换器转换到的类型)
+ * @param type 类型
+ * @param value 值
* @param defaultValue 默认值
* @return 转换后的值
*/
@@ -357,7 +363,7 @@ public class ConverterRegistry implements Serializable{
/**
* 注册默认转换器
- *
+ *
* @return 转换器
*/
private ConverterRegistry defaultConverter() {
diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/EnumItem.java b/hutool-core/src/main/java/cn/hutool/core/convert/EnumItem.java
deleted file mode 100644
index f620f6ea8..000000000
--- a/hutool-core/src/main/java/cn/hutool/core/convert/EnumItem.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package cn.hutool.core.convert;
-
-import java.io.Serializable;
-
-/**
- *
- *枚举元素通用接口,在自定义枚举上实现此接口可以用于数据转换
- *数据库保存时建议保存 intVal()而非ordinal()防备需求变更
- * @param
- */
-public interface EnumItem> extends Serializable{
-
- String name();
- /**
- * 在中文语境下,多数时间枚举会配合一个中文说明
- */
- default String text() {
- return name();
- }
-
- int intVal();
-
- @SuppressWarnings("unchecked")
- default E[] items() {
- return (E[]) this.getClass().getEnumConstants();
- }
- /**
- * 通过int类型值查找兄弟其他枚举
- * @param intVal
- * @return
- */
- default E fromInt(Integer intVal) {
- if(intVal==null) {
- return null;
- }
- E[] vs = items();
- for (E enumItem : vs) {
- if(enumItem.intVal()==intVal.intValue()) {
- return enumItem;
- }
- }
- return null;
- }
- /**
- * 通过String类型的值转换,根据实现可以用name/text
- * @param intVal
- * @return
- */
- default E fromStr(String strVal) {
- if(strVal==null) {
- return null;
- }
- E[] vs = items();
- for (E enumItem : vs) {
- if(strVal.equalsIgnoreCase(enumItem.name())) {
- return enumItem;
- }
- }
- return null;
- }
-
-
-}
-
diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/EnumConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/EnumConverter.java
index 634222ecf..6886736df 100644
--- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/EnumConverter.java
+++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/EnumConverter.java
@@ -1,7 +1,8 @@
package cn.hutool.core.convert.impl;
import cn.hutool.core.convert.AbstractConverter;
-import cn.hutool.core.convert.EnumItem;
+import cn.hutool.core.lang.EnumItem;
+import cn.hutool.core.lang.SimpleCache;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.EnumUtil;
@@ -11,7 +12,6 @@ import cn.hutool.core.util.ReflectUtil;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
@@ -24,7 +24,7 @@ import java.util.stream.Collectors;
public class EnumConverter extends AbstractConverter