如何动态创建请求映射?无需switch/if-else的实现方案
替代大量if-else创建Mapper的简洁方案
可以用映射表+函数式接口的方式彻底消除条件判断,代码更简洁且易于扩展:
1. 复用函数式接口(或自定义语义化接口)
如果所有Mapper的创建方法签名一致(接收inputpayload并返回Mapper),直接用Java内置的Function接口即可,也可以自定义更语义化的接口:
@FunctionalInterface interface MapperCreator { Mapper create(String inputPayload); }
2. 初始化请求类型与创建逻辑的映射表
提前把所有请求类型对应的Mapper创建逻辑存入静态Map,避免重复初始化:
private static final Map<String, MapperCreator> MAPPER_CREATORS = new HashMap<>(); static { MAPPER_CREATORS.put("AAA", RequestMapperAAA::createTypeRequest); MAPPER_CREATORS.put("BBB", RequestMapperBBB::createTypeRequest); MAPPER_CREATORS.put("CCC", RequestMapperCCC::createTypeRequest); MAPPER_CREATORS.put("DDD", RequestMapperDDD::createTypeRequest); // 后续新增类型直接在这里添加条目即可 }
3. 核心创建逻辑
一行代码完成Mapper实例化,完全不需要条件判断:
// 用Optional处理未知请求类型,避免空指针 Mapper mapper = Optional.ofNullable(MAPPER_CREATORS.get(requestType)) .map(creator -> creator.create(inputpayload)) .orElseThrow(() -> new IllegalArgumentException("不支持的请求类型: " + requestType));
方案优势
- 扩展性强:新增请求类型时,仅需在静态代码块中添加映射条目,无需修改业务逻辑,符合开闭原则。
- 代码简洁:把分散的条件判断集中到一处,业务逻辑一目了然。
- 可维护性高:所有类型与创建逻辑的对应关系清晰,便于后续修改或排查问题。
内容的提问来源于stack exchange,提问作者Devi
相关产品推荐
相关产品推荐

