多态通过运行时绑定替代编译期硬编码,将行为变化点抽象为接口,新增功能只需添加实现类而不修改原有代码,依赖注入与策略映射进一步剥离选择逻辑。

多态降低硬编码,核心在于用“运行时决定行为”替代“编译期写死逻辑”。它不靠 if-else 判断类型、不靠 switch 分支选实现、也不靠字段值(如 type=1 表示邮件)来驱动流程,而是把变化点抽成统一接口,让新增功能只需加类,不碰老代码。
用接口定义契约,消除类型判断
硬编码常见于根据某个标识字段做分支处理,比如:
- 硬编码典型:goods.getType() == 2 → 走折扣逻辑;goods.getType() == 3 → 走满减逻辑
-
多态解法:定义
PriceStrategy接口,让DiscountStrategy、FullReductionStrategy各自实现calculate(double price) - 调用方只持有
PriceStrategy strategy引用,完全不知道也不关心具体是哪种策略
依赖抽象而非具体实现
业务类不再 new 具体通知器或计算类,而是通过构造函数或方法参数接收抽象类型:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 原来:
new EmailNotifier()或if (type == "sms") new SmsNotifier()—— 类名、判断逻辑都写死在业务服务里 - 现在:
public NotificationService(Notifier notifier)—— 构造时注入任意实现,运行时才绑定真实对象 - 后续加微信通知,只要新增
WechatNotifier implements Notifier,连 NotificationService 的字节码都不用重编译
配合工厂或配置,让选择逻辑外移
谁来决定用哪个实现?这个“选择权”本身也要从主业务中剥离:
- 可由 Spring 容器按 profile 或条件自动装配不同 Bean
- 可用简单工厂根据配置项(如 application.yml 中的
notify.type: wechat)返回对应实例 - 甚至用策略映射表:
Mapstrategies = Map.of("email", new EmailNotifier(), "sms", new SmsNotifier()) - 主流程里只剩一行:
strategies.get(type).send(message),没有 if,没有 new,没有类型名硬编码
本质上,多态把“做什么”和“怎么做”彻底分开。硬编码是把“怎么做”直接塞进主干逻辑里;多态是把“怎么做”推给子类或实现类,主干只管“做什么”,靠接口这层抽象挡住所有具体细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










