多态消除 switch-case 的核心是将类型判断逻辑下放到对象自身行为中:通过定义统一接口(如 notificationhandler)、为各类型提供实现类(emailhandler 等),运行时动态调用 send() 方法,配合工厂或策略注册表管理实例,避免硬编码分支。

多态消除 switch-case 的核心,是把“根据类型做不同事”这件事,从外部判断逻辑转移到对象自身行为中——让每个类型自己决定怎么执行,而不是由一堆 case 去分发。
用接口定义统一行为
先看 switch 里所有 case 在干什么:它们通常是对不同类型的对象执行同一类动作,比如“计算折扣”“发送通知”“解析消息”。把这些共性操作提取成接口方法:
- 定义 NotificationHandler 接口,含 send(String msg) 方法
- 为每种渠道写实现类:EmailHandler、SmsHandler、PushHandler
- 原来 switch 中的每个 case,就变成对应 handler 实例的 send() 调用
运行时动态绑定,去掉类型判断
业务代码不再出现 if (type.equals("EMAIL")) 或 case "EMAIL":
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 把具体 handler 对象作为参数传入,或通过工厂/配置获取
- 调用时直接写
handler.send(message),JVM 自动调用对应子类方法 - 类型信息已封装在对象实例里,调用方完全不关心当前是哪一种
配合工厂或策略注册表管理实例
避免 new 满天飞,也方便扩展:
- 用 Map
预加载所有处理器,key 是类型标识(如 "EMAIL") - 新增渠道时,只往 map 里 put 一个新实例,不改原有分支逻辑
- Spring 环境下可用 @Qualifier + ApplicationContext.getBean() 自动注入
适用边界要清楚
多态不是万能钥匙,它适合这类场景:
- 多个类型共享同一组操作语义(如都支持“处理”“校验”“导出”)
- 各类型的行为差异稳定,不会频繁增删操作维度
- 不适用于操作完全不同、没有共性抽象的混杂类型(比如同时处理订单、日志、配置项)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










