如何将相似代码段提取成公共方法

在编写业务代码中,经常会遇到遇到逻辑相似的代码片段,但是想提取成公共的方法,又发现入参不一样,不知道该如何下手?或者知道使用泛型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 }
View Code
都是相似的操作,遍历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 }
View Code
服务车组:
public class CarGroupVO {
    /**
     * 车组id
     */
    private Integer groupId;
    /**
     * 车组名称
     */
    private String groupName;
    /**
     * 是否选中
     */
    private Boolean selected;
}
View Code
那么我们就可以将selected属性的getSelected()方法提取到一个接口,让他们实现它。(当然也可以将selected属性提取出来成为一个类,让他们继承)
public interface ISelectVo {
    Boolean getSelected();
}
View Code
然后,我们再将公共的代码抽出来,写成一个方法
    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);
        }
    }
View Code
这里传入一个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());
    }
View Code

 

 

posted @ 2020-04-24 16:35  Himoko  阅读(1275)  评论(1编辑  收藏  举报