Java方法泛型参数设置:如何合并同逻辑不同入参的两个方法
重复业务逻辑合并实现
当前代码现状
存在两个逻辑完全一致的方法,仅入参类型、内部获取图片列表的路径有区别:
- 入参为
ResponseEntity<OfferRest>的方法,需要先通过getBody()拿到Offer核心对象后,再遍历图片列表做判定private ResponseEntity<OfferRest> mappedOfferByImagesEnabled( ResponseEntity<OfferRest> offerResponse) { for (OfferDetailImageRest image : offerResponse.getBody().getOfferDetail().getImages()) { if (image.getDisabled()) { return offerResponse; } } return null; } - 入参为
OfferEntity的方法,可直接从入参获取Offer核心对象,遍历同结构的图片列表做判定private OfferEntity mappedOfferByImagesEnabled(OfferEntity offerEntity) { for (OfferDetailImageEntity image : offerEntity.getOfferDetail().getImages()) { if (image.getDisabled()) { return offerEntity; } } return null; }
合并实现思路
两个方法的核心判定逻辑完全一致,仅“从入参中提取待遍历图片列表”这一步存在差异,不需要为不同入参写完全重复的循环判定代码。可以借助Java函数式接口把差异化的提取逻辑抽离,把核心逻辑收敛到一个泛型方法里。
具体步骤
- 抽公共标记接口:不管是
OfferDetailImageRest还是OfferDetailImageEntity,都具备getDisabled()方法,抽一个最小接口统一约定这个能力,避免泛型通配符带来的类型转换问题// 所有带禁用标记的图片类都可以实现这个接口 public interface DisabledImageMarker { Boolean getDisabled(); } - 编写通用泛型方法,把核心判定逻辑写一次:
/** * 通用的禁用图片判定逻辑 * @param source 原始入参对象 * @param imageListExtractor 从入参中提取待检查图片列表的逻辑 * @return 遍历发现存在禁用图片时返回原入参,否则返回null * @param <T> 入参的泛型类型 */ private <T> T mappedOfferByImagesEnabled( T source, Function<T, List<? extends DisabledImageMarker>> imageListExtractor ) { List<? extends DisabledImageMarker> images = imageListExtractor.apply(source); for (DisabledImageMarker image : images) { if (image.getDisabled()) { return source; } } return null; } - 原调用场景传入对应的提取逻辑即可,不需要再写重复的循环判定代码:
- 传
ResponseEntity<OfferRest>的场景:// 替代原来的ResponseEntity版本方法 mappedOfferByImagesEnabled(offerResponse, resp -> resp.getBody().getOfferDetail().getImages() ); - 传
OfferEntity的场景:// 替代原来的OfferEntity版本方法 mappedOfferByImagesEnabled(offerEntity, entity -> entity.getOfferDetail().getImages() );
- 传
补充说明
如果不想额外抽标记接口,也可以把“判断图片是否禁用”的逻辑也作为函数参数传入通用方法,但会增加方法入参复杂度,不如抽最小标记接口清爽。通用方法对入参类型没有强制约束,只要传入对应的列表提取逻辑,后续新增其他Offer类型的入参时,不需要修改通用方法的核心判定逻辑,直接传对应的提取函数即可。
内容的提问来源于stack exchange,提问作者Hamdy
相关产品推荐
相关产品推荐

