如何将相似代码段提取成公共方法
在编写业务代码中,经常会遇到遇到逻辑相似的代码片段,但是想提取成公共的方法,又发现入参不一样,不知道该如何下手?或者知道使用泛型T,但是不知道要如何实现?
比如这段代码,判断是否选中。
1 // 判断日期类型 2 boolean flagDate = false; 3 if (CollectionUtils.isNotEmpty(ruleVO.getDateTypeList())) { 4 for (DateTypeVO dateTypeVO : ruleVO.getDateTypeList()) { 5 if (dateTypeVO.getSelected()) { 6 flagDate = true; 7 break; 8 } 9 } 10 } 11 if (!flagDate) { 12 throw new BusinessException("日期类型不能为空"); 13 } 14 // 判断服务车组 15 boolean flagCar = false; 16 if (CollectionUtils.isNotEmpty(ruleVO.getCarGroupList())) { 17 for (CarGroupVO carGroupVO : ruleVO.getCarGroupList()) { 18 if (carGroupVO.getSelected()) { 19 flagCar = true; 20 break; 21 } 22 } 23 } 24 if (!flagCar) { 25 throw new BusinessException("服务车组不能为空"); 26 }
都是相似的操作,遍历list,对对象的selected属性进行判断。那么要如何将这段代码提取成公共方法呢?因为是两个不同的对象,所以不能直接提取出来。
但是我们发现,上面的代码都是判断对象是否选中,也就是对selected这个属性进行判断,通过getSelected()这个方法,如下所示。
日期类型:
1 public class DateTypeVO { 2 /** 3 * 日期类型编号 4 */ 5 private String code; 6 /** 7 * 日期类型名称 8 */ 9 private String name; 10 /** 11 * 是否选中 12 */ 13 private Boolean selected; 14 }
服务车组:
public class CarGroupVO { /** * 车组id */ private Integer groupId; /** * 车组名称 */ private String groupName; /** * 是否选中 */ private Boolean selected; }
那么我们就可以将selected属性的getSelected()方法提取到一个接口,让他们实现它。(当然也可以将selected属性提取出来成为一个类,让他们继承)
public interface ISelectVo { Boolean getSelected(); }
然后,我们再将公共的代码抽出来,写成一个方法
public <T extends ISelectVo> void checkIsSelected(List<T> list, String msg) throws BusinessException { boolean flagItem = false; if (CollectionUtils.isNotEmpty(list)) { for (T itemVO : list) { if (itemVO.getSelected()) { flagItem = true; break; } } } if (!flagItem) { throw new BusinessException(msg); } }
这里传入一个List<T>的泛型,但是我们要设定这个T的范围,也就是它要继承这个ISelected接口,我们才能用到getSelected()方法。至此公共方法提取完成。
再举一个简单的例子,比如实体类中很多都有操作人,操作时间,修改人,修改时间这些字段,我们便可以把这些字段提取成一个BaseDomain类,让其它实体类继承它,然后在初始化值得时候,就可以省去这段代码得重复编写。
public <T extends BaseDomain> void setModifyInfo(T object) { object.setModifyEmp(Long.valueOf(AuthorityUtils.getUserId())); object.setModifyEmpName(AuthorityUtils.getUserName()); object.setModifyTime(new Date()); object.setCreateEmp(Long.valueOf(AuthorityUtils.getUserId())); object.setCreateEmpName(AuthorityUtils.getUserName()); object.setCreateTime(new Date()); }