工作中的第一个小问题

JAVA学习网 2017-07-19 10:51:07

工作3个月,第一次加入纯后台的程序改造,程序中,业务流程是有n个确定的对数据检测项,检测项有个开关,开了就检测blablabla,每个检测项为一个类,内方法不是static。

在原程序中流程为:对所有检测项目用if判断其是否为打开,然后实例化,调用方法。这样的代码重复挺多的,能有上500行了,除了各自实例化,剩下对返回信息的处理都是重复的。

看着不爽,所以就手贱了,全部改掉了。

改之前:

if("1".equals(Check1Map.get("swich"))){
     Check1 check1 = new Check1();
     errorMessage = check1.Checked(args);
     if(!"".equals(errorMessage) && rerrorMessage !=null){
        outMessage.add(errorMessage); 
     }
  }

if("1".equals(Check2Map.get("swich")) ){
     Check2 check2 = new Check2();
     errorMessage = check2.Checked(args);
     if(!"".equals(errorMessage) && rerrorMessage !=null){
        outMessage.add(errorMessage); 
     }
  }

我是这样改的,在从数据库取出检测项map时只取出开启的检测项,放到一个大的map中,用检测项名称循环,不再现场实例化,而是定义了一个static map 成员变量,

在其中放入实例化好的检测项实例,给所有检测项实现了一个接口,这样通过循环取得的检测名称。具体代码如下

成员变量类:

public class CheckedModel {

 private static final Map<String, CheckedService> checkeds = new HashMap<String, CheckedService>(){
    private static final long serialVersionUID = 1L; {
    put("c1", new Checked1());
    put("c2", new Checked2());
   }

 };

 public Map<String, CheckedService> getCheckeds() {
    return checkeds;
   }
}

检测流程代码:

其中CHECKED_MODEL为成员变量 就是 上面checkeds;

for(String bh : openCheckMap.keySet()){
  try {
    Map<String, Object> checkMap = openCheckMap.get(bh);
         errorMessage = CHECKED_MODEL.getCheckeds().get(bh).Checked(args);
       if(!"".equals(errorMessage) && rerrorMessage !=null){
         outMessage.add(errorMessage); 
      }
     } catch (Exception e) {
       logger.error("系统抛出异常信息:", e);
     }
}

这么做的原因一个是不喜欢用if一个一个判断之后一个一个实例化的去做, 重复代码太多了。所以想用for循环来取代if。在调用检测方法时用了下多态,方便使用吧算是。

然后选择用static是喜欢把程序运行时的实例化操作提前到项目加载时,希望减少在检测时的耗能。不知到这样是不是能提升一些性能。

不知道这个样的思路是否可行,是否还有其他的方法代替

 

 

 

if("1".equals(ToolUtil.getKeyOfMapToString(xmMap, "kqbs")) ){
    //实例化A1处理类
    A1ServiceImpl a1ServiceImpl = new A1ServiceImpl();
    //调用检测方法
    returnMessageEntity = a1ServiceImpl.Checked(jdbcTemplate,state,jcxmBH,dbSessionId , confirm,xmMap, deptCode,doctorCode,patData, hospitalMap);
               //更新全局变量状态
    state=returnMessageEntity.checkState;
    //如果提示信息不为空,添加到集合中
    if(!"".equals(returnMessageEntity.getCheckOutMessage()) && returnMessageEntity.getCheckOutMessage() !=null){
     
     outMessage.append(returnMessageEntity.getCheckOutMessage() ); 
    }
   }
   
   /**
    * 项目编号:   A7
    * 项目名称:行政权限_切口手术预防用药疗程限制
    *   I,II类切口手术预防用抗菌药疗程(24小时)限定及48小时审核  --目前是所有手术都限定
    */
    jcxmBH="A7";
    //取得对应检测项目信息
    xmMap =(Map<String, String>) openSwichMap.get(jcxmBH);
   //判断检测项目开启标示: 1 开启;0 关闭
   if("1".equals(ToolUtil.getKeyOfMapToString(xmMap, "kqbs")) ){
    
    //实例化A1处理类
    A7ServiceImpl a7ServiceImpl = new A7ServiceImpl();
    //调用检测方法
    returnMessageEntity = a7ServiceImpl.Checked( jdbcTemplate,state,jcxmBH,dbSessionId,confirm, xmMap,deptCode,doctorCode,patData,  bzh, operationData  ) ;
     //预防用抗菌药24小时-48小时申请审批,更新为已经使用,预判标识【confirm】为"save""all"时候,记录
    specOpera_kbn =returnMessageEntity.getSpecOpera_kbn();
    //更新全局变量状态
    state=returnMessageEntity.checkState;
    //如果提示信息不为空,添加到集合中
    if(!"".equals(returnMessageEntity.getCheckOutMessage()) && returnMessageEntity.getCheckOutMessage() !=null){
     outMessage.append(returnMessageEntity.getCheckOutMessage() ); 
    } 
    
   }

阅读(873) 评论(0)