在Java中如何设计高内聚低耦合的类_Java面向对象设计原则说明
发布时间 - 2026-01-21 00:00:00 点击率:次高内聚低耦合指类职责单一且内部协作紧密、类间依赖弱;Java中一眼可判:new具体实现类或import大量非本模块实现类即耦合高,应改用接口+构造器注入,并将行为封装进对应数据类。
什么是高内聚低耦合,Java里怎么一眼看出来
高内聚指一个类职责单一、内部方法紧密协作完成同一目标;低耦合指类之间依赖尽量弱,不直接持有对方实例,不硬编码调用细节。在Java中,最直观的判断方式是看 new 关键字和 import 语句:如果一个类频繁 new 其他具体类、或 import 大量非本模块的实现类(比如 import com.xxx.service.impl.UserServiceImpl),基本就是耦合过高。
用接口隔离 + 依赖注入代替 new 实例
避免在业务类中直接 new UserServiceImpl(),而是声明接口依赖,由外部传入或容器注入:
public class OrderProcessor {
private final UserService userService; // 依赖接口,不是实现类
public OrderProcessor(UserService userService) { // 构造器注入
this.userService = userService;
}
public void process(Order order) {
User user = userService.findById(order.getUserId());
// ...
}
}
- 接口
UserService定义契约,实现类可随时替换(如从
DB 切到缓存)
- 测试时可传入
MockUserService,无需启动数据库 - 若用 Spring,用
@Autowired注入也行,但构造器注入更清晰、不可变、易测 - 切忌在类内部写
new UserServiceImpl()—— 这会锁死实现,破坏可替换性
把状态和行为封装进同一个类,别拆成“DTO + 工具类”组合
常见反模式:定义 UserDto 存字段,再写个 UserHelper 放所有操作逻辑。这导致数据和行为分离,内聚度归零。
- 把校验、格式化、状态转换等逻辑放进
User类本身(只要不违反单一职责) - 例如
user.isValidEmail()比UserHelper.isValidEmail(user.getEmail())更内聚 - 若逻辑跨多个领域对象(如订单+库存联动),应提取新领域类(
OrderFulfillmentService),而不是塞进任一现有类 - DTO 只用于层间传输(如 Controller → Service),不参与业务逻辑
警惕“上帝类”和过度抽象带来的假低耦合
为解耦而抽象出一堆空接口、模板类、回调函数,结果每个类都依赖 AbstractBaseProcessor 和 CallbackHandlerFactory,实际只是把耦合从具体类转移到抽象结构上。
- 优先用组合而非继承:
PaymentService持有NotificationSender和LogRecorder,比继承BaseTransactionService更可控 - 接口粒度要合理:一个
UserService没问题,但拆成FindUserPort、CreateUserPort、UpdateUserPort就过头了 - 真正低耦合的表现是:改一个模块(如换支付渠道),只动
AlipayAdapter和配置,其他类完全不动、不重编译
内聚和耦合不是靠设计模式数量衡量的,而是看修改一处时,有多少其他地方被迫跟着改。每次加新功能前,先问一句:这个逻辑放在这里,是不是只有它自己需要?它是否必须知道别的类怎么实现?
# java
# 编码
# 回调函数
# 工具
# ai
# red
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
高端建站如何打造兼具美学与转化的品牌官网?
JS去除重复并统计数量的实现方法
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
EditPlus中的正则表达式实战(5)
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
Laravel如何集成Inertia.js与Vue/React?(安装配置)
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
Laravel如何使用.env文件管理环境变量?(最佳实践)
制作旅游网站html,怎样注册旅游网站?
在线制作视频的网站有哪些,电脑如何制作视频短片?
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
详解Android中Activity的四大启动模式实验简述
Android滚轮选择时间控件使用详解
linux写shell需要注意的问题(必看)
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
网站制作企业,网站的banner和导航栏是指什么?
北京专业网站制作设计师招聘,北京白云观官方网站?
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
IOS倒计时设置UIButton标题title的抖动问题
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
C++时间戳转换成日期时间的步骤和示例代码
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
C语言设计一个闪闪的圣诞树
手机软键盘弹出时影响布局的解决方法
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Java垃圾回收器的方法和原理总结
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
如何在Ubuntu系统下快速搭建WordPress个人网站?
如何快速搭建高效简练网站?
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
香港网站服务器数量如何影响SEO优化效果?
黑客如何利用漏洞与弱口令入侵网站服务器?


