0

0

在Java中如何实现对象行为的委托_JavaDelegationPattern应用解析

P粉602998670

P粉602998670

发布时间:2026-01-23 08:39:10

|

923人浏览过

|

来源于php中文网

原创

Java中用组合代替继承实现委托,关键在于接口定义、字段封装和方法转发,委托类只暴露必要行为,需显式处理equals/hashCode/toString,泛型委托要注意类型擦除,且须厘清委托、代理与装饰器的职责边界。

在java中如何实现对象行为的委托_javadelegationpattern应用解析

Java里用组合代替继承做行为委托,关键在接口和字段设计

Java没有原生的委托语法(比如 Kotlin 的 by),但通过接口 + 成员字段 + 方法转发,就能干净实现委托模式。核心不是“怎么写”,而是“谁该暴露什么方法”——委托类只暴露被委托对象的**必要行为**,不泄露内部细节或冗余方法。

  • 先定义清晰的接口(如 DataSourceLogger),这是委托契约的基础
  • 委托者类(如 UserService)持有一个该接口的字段(private final DataSource dataSource
  • 所有需要委托的方法,直接调用该字段对应方法,不做额外逻辑——有逻辑就说明不该委托,该继承或策略化
  • 避免在委托方法里加空值检查或日志:那是代理(Proxy)或装饰器(Decorator)的事,不是委托

委托时绕不开的 equals/hashCode/toString 怎么处理

如果委托类重写了 equalshashCode,又依赖被委托对象的实现,必须显式转发,否则默认是引用比较,会破坏逻辑一致性。JDK 本身不帮你做这件事。

public class UserService {
    private final DataSource dataSource;

    public UserService(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        UserService that = (UserService) o;
        return Objects.equals(dataSource, that.dataSource); // 显式委托到 dataSource.equals()
    }

    @Override
    public int hashCode() {
        return Objects.hash(dataSource); // 同样委托
    }
}
  • toString() 同理:若需体现委托对象状态,应包含 dataSource.toString(),而不是只写类名
  • 不要盲目用 Lombok 的 @EqualsAndHashCode(of = "dataSource")——它生成的是字段值比较,但若 dataSource 本身没正确实现 equals,结果仍错
  • 如果委托对象是不可变且已正确定义了这些方法(如 StringUUID),可放心转发;否则得先确认它的契约

泛型委托类如何避免类型擦除导致的运行时问题

写一个通用委托容器(如 DelegatingList<t></t>)时,构造时传入的 List<t></t> 在运行时只剩 List,但多数场景下只要方法签名一致,不影响委托行为。真正出问题的是反射或序列化场景。

腾讯交互翻译
腾讯交互翻译

腾讯AI Lab发布的一款AI辅助翻译产品

下载
  • 别在委托类里用 getClass().getGenericSuperclass() 去提取 T 类型——擦除后拿不到,会得到 Object
  • 如果必须保留类型信息(比如做 JSON 反序列化),构造时额外传入 TypeReference<list>></list>Class<user></user> 参数
  • Spring 的 DelegatingFilterProxy 就是典型泛型委托,但它靠 Bean 名称和上下文定位目标对象,不依赖泛型运行时信息

和代理(Proxy)、装饰器(Decorator)混用时,职责必须划清

委托(Delegation)只做「把请求转给另一个对象」,不改变行为语义;代理加控制逻辑(如权限、事务),装饰器增强行为(如缓存、日志)。三者代码结构相似,但意图不同,混用会导致维护困难。

立即学习Java免费学习笔记(深入)”;

  • java.lang.reflect.Proxy 或 CGLIB 是动态代理,适合切面场景;委托是静态、编译期确定的
  • 装饰器通常实现同一接口并持有被装饰对象,但会在方法前后加逻辑;委托则严格“原样转发”
  • 一个类同时做委托 + 日志记录?那它已经不是委托者,是装饰器了——此时应拆成 LoggingUserService 包裹 UserService,后者再委托 DataSource

委托真正的难点不在写法,而在于判断:这个行为,到底该由当前对象自己承担,还是交给别人?一旦委托关系过深(A→B→C→D),链路就难追踪,这时候就得考虑是否该用事件驱动或命令总线来解耦。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

123

2026.02.12

spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

156

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

88

2026.01.26

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

456

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

547

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1030

2023.08.02

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.2万人学习

Java 教程
Java 教程

共578课时 | 81.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号