枚举驱动策略选择是面试高频解法,核心是让枚举承担策略标识、路由与调度职责,通过关联class或bean名、提供gethandler()方法实现类型安全与解耦,配合统一策略接口和工厂类提升可扩展性与可测试性。

直接用枚举驱动策略选择,是面试中高频且落地性强的解法。核心不是堆砌概念,而是让枚举成为策略的“注册中心”和“调度入口”,避免硬编码 if-else 或 switch,同时保证类型安全和可扩展性。
枚举要承担策略标识和路由职责
枚举不能只当常量容器,得让它主动参与策略分发。比如题目类型枚举里,每个值不仅要带 name 和 code,还要关联对应策略类的 Class 对象或 Bean 名称:
- 在枚举常量中声明 对应的策略处理器类型,例如
SINGLE_CHOICE(1, SingleTypeHandler.class) - 提供一个通用方法
getHandler(),通过 Spring 上下文获取对应 Bean(需配合@Resource或ApplicationContext) - 这样调用方只需传入枚举值,就能拿到“开箱即用”的策略实例,完全解耦
策略接口统一,实现类专注业务逻辑
定义一个顶层策略接口(如 SubjectTypeHandler),所有具体策略都实现它。关键点在于:
- 接口方法签名要抽象出共性操作,比如
add(SubjectInfo info)、validate(SubjectInfo info) - 每个实现类只处理自己类型的字段校验、数据转换、持久化逻辑,不感知其他题型
- 用
@Component注册为 Spring Bean,并确保类名或 Bean 名能被枚举准确引用
工厂逻辑收口到工具类或服务类
不建议在 Controller 层直接 new 实例或手动判断 type。推荐做法是封装一个策略获取器:
- 写一个
SubjectHandlerFactory工具类,接收int type或String typeCode - 先通过枚举静态方法
SubjectTypeEnum.fromIndex(type)转成枚举实例 - 再调用枚举的
getHandler()获取策略 Bean,执行业务方法 - 异常时统一抛出
IllegalArgumentException或自定义异常,避免空指针或类型错配
面试加分项:讲清为什么比 if-else 强
别只说“解耦”“可维护”,要结合场景说透:
- 新增题型时,只需加一个枚举常量 + 一个策略实现类,不用改任何已有分支逻辑
- 单元测试可针对每个策略类独立覆盖,比如单选题的选项数量校验、多选题的最小选择数限制
- 枚举天然防非法输入,传入非法 type 值会直接报错,而不是静默走默认分支或 NPE
- Spring 管理 Bean 生命周期,策略类可自由注入 service、converter 等依赖,无需手动构造
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











