多态不直接减少分支,而是将if-else或switch从业务代码移至对象创建或状态封装环节;通过接口+实现类、工厂/枚举/状态模式解耦判断逻辑,新增类型无需修改调用方代码。

Java 中多态本身不直接“减少”分支判断,而是把原本散落在业务代码里的 if-else 或 switch,转移到更合理的位置——对象创建环节或状态封装内部,让调用方彻底摆脱类型判断。
把类型判断从调用方移到工厂或注册表
当业务方法中反复出现类似 if ("ALIPAY".equals(payType)) { ... } else if ("WECHAT".equals(payType)) { ... } 时,说明判断逻辑本该由外部解耦。正确做法是:
- 定义统一接口(如
PaymentHandler),声明通用行为(handle()) - 为每种支付方式写独立实现类(
AlipayHandler、WechatHandler) - 用
Map<String, PaymentHandler>在启动时注册所有实现 - 运行时通过
handlers.get(payType).handle(data)直接调用,不再写分支
用枚举内置行为替代简单状态分发
对于固定、稳定且数量不多的状态(如订单状态 CREATED、PAID、SHIPPED),可直接在枚举中定义抽象方法:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 每个枚举常量实现自己的
process(Order order)逻辑 - 调用方只需写
orderStatus.process(order),一行完成专属处理 - 天然单例、线程安全、无对象创建开销,比策略模式更轻量
状态模式让对象自己决定怎么响应
当行为随运行时状态动态变化(如播放器的 Idle→Running→Paused),适合用状态模式:
立即学习“Java免费学习笔记(深入)”;
- 每个状态是一个独立类(
RunningState、PausedState),实现同一接口State - 上下文(如
Player)只持有一个State引用,所有操作委托给当前状态 - 状态切换由状态自身驱动(例如
RunningState收到暂停指令后主动切换上下文的状态引用) - 新增状态只需加类+注册,上下文和已有状态完全不动
警惕不该用多态的地方
不是所有 if-else 都适合被替换。以下情况强行多态反而增加复杂度:
- 分支之间仅参数不同(比如只差一个超时时间、一个文件后缀),更适合配置驱动或构造函数传参
- 逻辑极简(如只返回不同字符串),拆成多个类会抬高理解成本
- 判断依据是动态组合条件(如
status == 1 && amount > 1000 && userLevel == VIP),应考虑规则引擎或责任链

















