Java面向对象编程如何避免滥用继承_OOP继承设计规范说明
发布时间 - 2025-12-27 00:00:00 点击率:次避免滥用继承的关键是严格遵循“is-a”业务语义,优先用组合替代继承,确保符合里氏替换原则,慎用模板方法,杜绝为测试或复用而继承。
避免滥用继承的关键,是把“is-a”关系真正落实为业务语义上的严格归属,而不是为了代码复用或结构相似就强行拉关系。
优先用组合代替继承
当类之间只是“有”某种能力或行为(比如“汽车有发动机”),而不是“是”某种类型(比如“宝马是汽车”),就该用组合。继承会把父类的实现细节一并拖进来,耦合太紧;组合则只依赖接口或具体类的行为,更灵活、更易测试。
- 把共用逻辑封装成独立类,通过字段持有它,而不是继承它
- 用接口定义能力契约(如 Runnable、Comparable),让类去实现,而非继承抽象基类
- Spring 的 DataSource、TransactionManager 都是组合驱动的设计范例
继承必须满足里氏替换原则(LSP)
子类对象必须能无缝替换父类对象,且不改变程序正确性。一旦发现子类要重写父类方法并抛异常、返回 null、缩小参数范围、扩大返回类型,或者不得不在调用前加 instanceof 判断——说明继承已违背 LSP,该重构了。
- 子类不能削弱父类的前置条件(输入约束不能更严)
- 子类不能加强父类的后置条件(输出保证不能更弱)
- 不要让子类“拒绝实现”父类声明的方法(比如抛 UnsupportedOperationException)
慎用模板方法模式,警惕抽象类膨胀
抽象类本意是定义骨架,但容易变成“所有子类都要改”的中心节点。一旦新增一个钩子方法,就得同步更新全部子类;一旦修改模板逻辑,风险波及整个继承树。
- 抽象类只保留真正稳定、不可变的核心流程,其余行为尽量交给策略接口注入
- 考虑用函数式接口 + Lambda 替代固定步骤的抽象类(如 Consumer
、Function ) - 如果抽象类已有 3 个以上非 final 方法,或子类重写率超 60%,就要评估是否该拆成组合+策略
禁止为“方便测试”或“减少代码量”而继承
继承不是快捷键。为绕过 private 访问、为少写几个 getter、为 mock 父类方法而继承,都会污染领域模型。单元测试应面向接口或行为,而不是靠继承钻访问漏洞。
- 测试时用 Mockito 的 @Mock 或 spy,而不是继承被测类来覆盖方
法 - 工具类、常量类、DTO 类都不该被继承——它们不是类型,只是载体
- 如果只是为了复用某段逻辑,提取为 static 工具方法 或 default 接口方法 更安全
基本上就这些。继承本身没错,错的是把它当成万能胶水。想清楚“这个子类真的属于父类的分类体系吗”,比急着写 extends 要紧得多。
# java
# 工具
# 面向对象编程
# 代码复用
# lsp
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
如何快速上传建站程序避免常见错误?
详解Android——蓝牙技术 带你实现终端间数据传输
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
详解Huffman编码算法之Java实现
🚀拖拽式CMS建站能否实现高效与个性化并存?
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
Laravel distinct去重查询_Laravel Eloquent去重方法
如何在阿里云购买域名并搭建网站?
企业网站制作这些问题要关注
制作企业网站建设方案,怎样建设一个公司网站?
如何快速上传自定义模板至建站之星?
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
JS中对数组元素进行增删改移的方法总结
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
如何在景安服务器上快速搭建个人网站?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
焦点电影公司作品,电影焦点结局是什么?
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
高性能网站服务器配置指南:安全稳定与高效建站核心方案
微信小程序 配置文件详细介绍
Laravel怎么判断请求类型_Laravel Request isMethod用法
Laravel如何集成Inertia.js与Vue/React?(安装配置)
如何在Ubuntu系统下快速搭建WordPress个人网站?
手机软键盘弹出时影响布局的解决方法
如何在IIS7中新建站点?详细步骤解析
如何彻底删除建站之星生成的Banner?
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
html5的keygen标签为什么废弃_替代方案说明【解答】
SQL查询语句优化的实用方法总结
JavaScript如何实现类型判断_typeof和instanceof有什么区别
如何用狗爹虚拟主机快速搭建网站?
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
如何快速查询域名建站关键信息?
北京专业网站制作设计师招聘,北京白云观官方网站?
Laravel如何生成API文档?(Swagger/OpenAPI教程)
Python图片处理进阶教程_Pillow滤镜与图像增强
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Laravel用户密码怎么加密_Laravel Hash门面使用教程
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
Swift中switch语句区间和元组模式匹配
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
如何在IIS7上新建站点并设置安全权限?


法