程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 快速入门

  • 克隆

  • 类型转换

    • 类型转换工具类 - Convert
    • 自定义类型转换 - ConverterRegistry
      • 1. 由来
      • 2. 解决方案
        • 2.1 示例代码
        • 2.2 实际开发中的应用
      • 3. 自定义转换
        • 3.1 自定义转换器
        • 定义自定义转换器
        • 注册转换器
        • 执行转换
        • 3.2 实际开发中的应用
      • 4. ConverterRegistry 单例和对象模式
        • 4.1 示例代码
        • 4.2 实际开发中的应用
  • 日期时间

  • IO流相关

  • 工具类

  • 语言特性

  • JavaBean

  • 集合类

  • Map

  • Codec编码

  • 文本操作

  • 注解

  • 比较器

  • 异常

  • 数学

  • 线程和并发

  • 图片

  • 网络

  • 源码编译

  • 配置文件

  • 日志

  • 缓存

  • JSON

  • 加密解密

  • DFA查找

  • HTTP客户端

  • 定时任务

  • 扩展

  • 切面

  • 脚本

  • Office文档操作

  • 系统调用

  • 图形验证码

  • 网络Socket

  • JWT

  • Hutoll
  • 类型转换
scholar
2024-08-20
目录

自定义类型转换 - ConverterRegistry

# 自定义类型转换 - ConverterRegistry


# 1. 由来

Hutool 中的类型转换最初是通过 Convert 工具类实现的,每种类型的转换都是通过静态方法来表示。然而,这种方式的扩展性较差,无法满足所有可能的类型转换需求。因此,Hutool 引入了 ConverterRegistry,用于管理类型转换器并提供更灵活的类型转换机制。


# 2. 解决方案

为了提升扩展性,Hutool 提供了以下解决方案:

  • Converter 接口:这是一个类型转换接口。通过实现这个接口并重写其 convert 方法,可以自定义对象的类型转换逻辑。
  • ConverterRegistry 类型转换登记中心:这是一个管理所有类型转换器的中心。ConverterRegistry 存储了 Hutool 中的默认转换器和用户自定义的转换器。通过 ConverterRegistry 的 convert 方法,可以自动查找目标类型的转换器,并将对象转换为指定类型。

# 2.1 示例代码

int a = 3423;
ConverterRegistry converterRegistry = ConverterRegistry.getInstance(); // 获取 ConverterRegistry 的单例实例
String result = converterRegistry.convert(String.class, a); // 将整数 a 转换为字符串
Assert.assertEquals("3423", result); // 断言结果为 "3423"
1
2
3
4

API 使用说明

  • ConverterRegistry.getInstance():

    • 作用:返回 ConverterRegistry 的单例实例。此方法保证全局只有一个 ConverterRegistry 实例,所有类型转换都通过这个实例管理。
    • 语法:ConverterRegistry.getInstance()
    • 参数:无。
    • 返回值:返回 ConverterRegistry 的单例实例。
  • convert(Class<T> type, Object value):

    • 作用:将 value 转换为指定的 type 类型。
    • 语法:<T> T convert(Class<T> type, Object value)
    • 参数:
      • type:目标类型的 Class 对象。例如,String.class。
      • value:要转换的对象。
    • 返回值:转换后的对象,类型为 T。

# 2.2 实际开发中的应用

在实际开发中,ConverterRegistry 非常适合用于将一种类型的对象动态转换为另一种类型。例如,将数据库字段值转换为 Java 对象的属性值,或者在多层架构中进行对象跨层转换。

public class Application {
    public static void main(String[] args) {
        ConverterRegistry converterRegistry = ConverterRegistry.getInstance();

        // 将整数转换为字符串
        int userId = 12345;
        String userIdStr = converterRegistry.convert(String.class, userId);
        
        // 将字符串转换为 URL
        String urlString = "https://example.com";
        URL url = converterRegistry.convert(URL.class, urlString);

        // 进行业务操作
        System.out.println("用户 ID:" + userIdStr);
        System.out.println("URL:" + url);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 3. 自定义转换

Hutool 提供了许多默认的类型转换器,但在某些情况下,我们可能需要自定义转换逻辑。可以使用 ConverterRegistry.getInstance().putCustom() 方法来自定义类型转换。

# 3.1 自定义转换器

# 定义自定义转换器

首先,我们定义一个实现 Converter 接口的自定义转换器。在这个例子中,我们将自定义一个将对象转换为特定格式字符串的转换器。

public static class CustomConverter implements Converter<String> {
    @Override
    public String convert(Object value, String defaultValue) throws IllegalArgumentException {
        // 将对象转换为自定义格式的字符串
        return "Custom: " + value.toString();
    }
}
1
2
3
4
5
6
7

API 使用说明

  • Converter 接口:
    • 作用:提供一个标准的类型转换接口。通过实现这个接口,可以自定义任意类型的转换逻辑。
    • 语法:public interface Converter<T>
    • 主要方法:
      • T convert(Object value, T defaultValue):
        • 作用:将 value 转换为类型 T,如果转换失败则返回 defaultValue。
        • 语法:T convert(Object value, T defaultValue)
        • 参数:
          • value:要转换的对象。
          • defaultValue:转换失败时返回的默认值。
        • 返回值:转换后的对象,类型为 T。

# 注册转换器

然后,我们将自定义的转换器注册到 ConverterRegistry 中。

ConverterRegistry converterRegistry = ConverterRegistry.getInstance();
// 自定义 String 类型的转换器
converterRegistry.putCustom(String.class, CustomConverter.class);
1
2
3

API 使用说明

  • putCustom(Class<T> type, Class<? extends Converter<T>> converterClass):
    • 作用:将自定义的转换器注册到 ConverterRegistry 中,以处理指定类型的转换。
    • 语法:<T> void putCustom(Class<T> type, Class<? extends Converter<T>> converterClass)
    • 参数:
      • type:目标类型的 Class 对象。例如,String.class。
      • converterClass:自定义转换器的 Class 对象。例如,CustomConverter.class。
    • 返回值:无。

# 执行转换

最后,使用自定义转换器进行类型转换。

int a = 454553;
// 使用自定义转换器将整数 a 转换为字符串
String result = converterRegistry.convert(String.class, a);
Assert.assertEquals("Custom: 454553", result);
1
2
3
4

API 使用说明

  • convert(Class<T> type, Object value):
    • 作用:使用已注册的转换器将 value 转换为指定的 type 类型。如果自定义转换器已经注册,会优先使用自定义转换器。
    • 语法:<T> T convert(Class<T> type, Object value)
    • 参数:
      • type:目标类型的 Class 对象。例如,String.class。
      • value:要转换的对象。
    • 返回值:转换后的对象,类型为 T。

# 3.2 实际开发中的应用

在实际开发中,自定义转换器可以用于将数据转换为特定格式,以便在系统中更容易使用。例如,将日志数据转换为特定格式的字符串用于输出或存储。

public class Application {
    public static void main(String[] args) {
        // 获取 ConverterRegistry 实例
        ConverterRegistry converterRegistry = ConverterRegistry.getInstance();

        // 自定义转换器
        converterRegistry.putCustom(String.class, CustomConverter.class);

        // 使用自定义转换器将整数转换为特定格式的字符串
        int logId = 67890;
        String formattedLogId = converterRegistry.convert(String.class, logId);

        // 输出或存储格式化后的日志 ID
        System.out.println("格式化后的日志 ID:" + formattedLogId);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 4. ConverterRegistry 单例和对象模式

ConverterRegistry 提供了一个静态方法 getInstance() 来返回全局单例对象,这是推荐的使用方式。然而,如果你希望在某个限定范围内自定义转换,你也可以实例化 ConverterRegistry 对象。

# 4.1 示例代码

  1. 使用全局单例

    ConverterRegistry converterRegistry = ConverterRegistry.getInstance(); // 获取全局单例
    
    1
  2. 使用实例对象

    ConverterRegistry customRegistry = new ConverterRegistry(); // 实例化对象
    
    1

API 使用说明

  • ConverterRegistry.getInstance():

    • 作用:返回 ConverterRegistry 的全局单例实例,保证全局只有一个实例用于类型转换。
    • 语法:ConverterRegistry.getInstance()
    • 参数:无。
    • 返回值:ConverterRegistry 的单例实例。
  • new ConverterRegistry():

    • 作用:实例化一个新的 ConverterRegistry 对象,用于在特定范围内管理类型转换。
    • 语法:new ConverterRegistry()
    • 参数:无。
    • 返回值:一个新的 ConverterRegistry 实例。

# 4.2 实际开发中的应用

在大多数情况下,使用 ConverterRegistry 的单例模式即可满足需求,尤其是在需要全局统一管理类型转换的场景中。对于局部的、特定场景的类型转换需求,可以实例化 ConverterRegistry 对象来管理这些转换逻辑。

public class Application {
    public static void main(String[] args) {
        // 使用全局单例进行通用转换
        ConverterRegistry globalRegistry = ConverterRegistry.getInstance();
        String globalResult = globalRegistry.convert(String.class, 123);

        // 使用自定义实例进行特定转换
        ConverterRegistry localRegistry = new ConverterRegistry();
        localRegistry.putCustom(String.class, CustomConverter.class);
        String localResult = localRegistry.convert(String.class, 456);

        System.out.println("全局转换结果:" + globalResult);
        System.out.println("局部转换结果:" + localResult);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

总结

ConverterRegistry 提供了灵活的类型转换机制。通过自定义转换器,可以轻松实现特定的类型转换需求。结合单例和实例对象的使用方式,ConverterRegistry 可以很好地适应各种开发场景,简化类型转换逻辑,提高代码的可维护性和扩展性。

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
类型转换工具类 - Convert
日期时间工具 - `DateUtil`

← 类型转换工具类 - Convert 日期时间工具 - `DateUtil`→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式