Java中多个ifelse语句的替代设计、Optional用法大全

目录

普通代码

思路--案例重构代码

详解--重构项目代码

重构自身Ctrl

重构公共Ctrl

不重构公共interface

重构公共实现类

附上Optional用法大全


  • 普通代码

  1. 首先声明:这篇文章是根据此文章《大数据技术与结构》,将现在的项目代码结构进行的二次调整的练习实战!
  2. 多层次if/else代码内容:

下面方法作用是:根据不同的类型进行对应的service处理!!!不是我写的,是同事写的。

 /**
     * 项目上报
     *    resultObj 中需要返回 上报时,还进行上报操作的数据对象 . 参考 TDCB_ZXZQFXJH 中的 oldTNewZxzq
     * @param xmGuid 项目ID
     * @param ywLx  业务类型
     * @Return: com.gisquest.realestate.vo.ResponseBodyVo<java.lang.Object>
     * @Author: xiongYiMing , 2019-05-22 07:46:26
     * @Modify:
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ResponseBodyVo<Object> shangbao(String xmGuid, String ywLx) {

        ResponseBodyVo<Object> resultObj= new ResponseBodyVo<Object>();
        // 参照 XmchServiceImpl 里书写自己的业务类型判断
        if(YwlxCommon.TDCB_ZXZQFXJH.equals(ywLx)) {
            TNewZxzq tNewZxzq = new TNewZxzq();
            tNewZxzq.setZxzqguid(xmGuid);
            resultObj = iZxzqFxjhService.shangBao(tNewZxzq,new Object());
        } else if(YwlxCommon.TDCB_ZQSJFXJH.equals(ywLx)){
            // 债券实际发行计划
            TNewzxzqfxqk tNewzxzqfxqk = new TNewzxzqfxqk();
            tNewzxzqfxqk.setFxqkGuid(xmGuid);
            resultObj = iZqsjfxqkService.shangBao(tNewzxzqfxqk,new Object());
        }else if(YwlxCommon.TDCB_ZQHKQK.equals(ywLx)){
            TNewzqhkqk tNewzqhkqk = new TNewzqhkqk();
            tNewzqhkqk.setZqhkqkGuid(xmGuid);
            resultObj =  iZqhkqkService.shangBao(tNewzqhkqk, new Object());
        } else if(YwlxCommon.TDCB_CBXM.equals(ywLx)){//储备项目
            Cbxm cbxm = new Cbxm();
            cbxm.setCbxmGuid(xmGuid);
            resultObj =  cbxmService.shangBao(cbxm, new Object());
        } else if(YwlxCommon.TDCB_ZJNDYS.equals(ywLx)){//资金年度预算
            Cbxmbdys cbxmbdys = new Cbxmbdys();
            cbxmbdys.setCbxmbdysGuid(xmGuid);
            resultObj =  zjndysService.shangBao(cbxmbdys, new Object());
        } else if(YwlxCommon.TDCB_XMWCQK.equals(ywLx)){//项目完成情况
            Cbxmwcqk cbxmwcqk = new Cbxmwcqk();
            cbxmwcqk.setWcqkGuid(xmGuid);
            resultObj =  xmwcqkService.shangBao(cbxmwcqk, new Object());
        } else if (YwlxCommon.TDCB_NDTDJH.equals(ywLx)){
            resultObj = ndcbtdjhService.shangbao(xmGuid);
        }

        if( successStatus.equals(resultObj.getStatus().toString())){
            // 1. 进行工作台操作
            resultObj = procesShenhe(resultObj, xmGuid, ywLx);
        }
        return resultObj;
    }

 看了此文章《大数据技术与结构》,上述简单操作感觉switch语句更加适合一些

将同事的代码改造成switch...case...,默认default存在,及时什么也不写。

 public ResponseBodyVo<Object> shangbao(String xmGuid, String ywLx) {

        ResponseBodyVo<Object> resultObj = new ResponseBodyVo<Object>();

        switch (ywLx) {
            case YwlxCommon.TDCB_ZXZQFXJH:
                TNewZxzq tNewZxzq = new TNewZxzq();
                tNewZxzq.setZxzqguid(xmGuid);
                resultObj = iZxzqFxjhService.shangBao(tNewZxzq, new Object());
                break;
            case YwlxCommon.TDCB_ZQSJFXJH:
                // 债券实际发行计划
                TNewzxzqfxqk tNewzxzqfxqk = new TNewzxzqfxqk();
                tNewzxzqfxqk.setFxqkGuid(xmGuid);
                resultObj = iZqsjfxqkService.shangBao(tNewzxzqfxqk, new Object());
                break;
            case YwlxCommon.TDCB_ZQHKQK:
                TNewzqhkqk tNewzqhkqk = new TNewzqhkqk();
                tNewzqhkqk.setZqhkqkGuid(xmGuid);
                resultObj = iZqhkqkService.shangBao(tNewzqhkqk, new Object());
                break;
            case YwlxCommon.TDCB_CBXM://储备项目
                Cbxm cbxm = new Cbxm();
                cbxm.setCbxmGuid(xmGuid);
                resultObj = cbxmService.shangBao(cbxm, new Object());
                break;
            case YwlxCommon.TDCB_ZJNDYS://资金年度预算
                Cbxmbdys cbxmbdys = new Cbxmbdys();
                cbxmbdys.setCbxmbdysGuid(xmGuid);
                resultObj = zjndysService.shangBao(cbxmbdys, new Object());
                break;
            case YwlxCommon.TDCB_XMWCQK://项目完成情况
                Cbxmwcqk cbxmwcqk = new Cbxmwcqk();
                cbxmwcqk.setWcqkGuid(xmGuid);
                resultObj = xmwcqkService.shangBao(cbxmwcqk, new Object());
                break;
            case YwlxCommon.TDCB_NDTDJH:
                resultObj = ndcbtdjhService.shangbao(xmGuid);
                break;
            default:
        }

        if (successStatus.equals(resultObj.getStatus().toString())) {
            // 1. 进行工作台操作
            resultObj = procesShenhe(resultObj, xmGuid, ywLx);
        }
        return resultObj;
    }
  • 思路--案例重构代码

思路讲解:1、可从上面案例得知是通过枚举比对,处理不同的业务逻辑,也就是说每个都有自己的interface定义,所以为了不影响自己的interface,我们需要抽象出一个公共的interface,并且让每一个去继承他。

1、将每个对应service的interface中的上报抽到Shangbao.class中
如:
public interface CbxmService {
	ResponseBodyVo<Object> shangBao(Cbxm cbxm, Object object);
}
......



变成如下
/**
 * @Description : common【service的公共接口】
 * @Auth : Xuhy
 * @Date : 2019-08-09
 * @Time : 10:11
 */
public interface Shangbao {

    ResponseBodyVo<Object> shangBao(String xmGuid);

   /* // YwlxCommon.TDCB_ZXZQFXJH
    ResponseBodyVo<Object> shangBao(TNewZxzq tNewZxzq, Object object);
    // YwlxCommon.TDCB_ZQSJFXJH
    ResponseBodyVo<Object> shangBao(TNewzxzqfxqk tNewzxzqfxqk, Object object);
    // YwlxCommon.TDCB_ZQHKQK
    ResponseBodyVo<Object> shangBao(TNewzqhkqk tNewzqhkqk, Object object);
    // YwlxCommon.TDCB_CBXM
    ResponseBodyVo<Object> shangBao(Cbxm cbxm, Object object);
    // YwlxCommon.TDCB_ZJNDYS
    ResponseBodyVo<Object> shangBao(Cbxmbdys cbxmbdys, Object object);
    // YwlxCommon.TDCB_XMWCQK
    ResponseBodyVo<Object> shangBao(Cbxmwcqk cbxmwcqk, Object object);
    // YwlxCommon.TDCB_NDTDJH
    ResponseBodyVo<Object> shangbao(String xmGuid);*/
}


问:为什么这么写呢?
答:每个service都有自己的interface,为了不影响自己的Impl,将其抽象成一个公共的接口,自己的interface extend即可。


public interface CbxmService extends Shangbao{

    // 继承之后将原先的shangBao注释
    // ResponseBodyVo<Object> shangBao(Cbxm cbxm, Object object);
}

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

/**
 * @Description : 
 * @Auth : Xuhy
 * @Date : 2019-08-08 
 * @Time : 15:42
 */
public class ShangbaoFactory {
    static Map<String, Shangbao> shangbaoMap = new HashMap<>();

    static {
        shangbaoMap.put(YwlxCommon.TDCB_ZXZQFXJH, new ZxzqFxJhServiceImpl());
        shangbaoMap.put(YwlxCommon.TDCB_ZQSJFXJH, new ZqsjfxqkServiceImpl());
        shangbaoMap.put(YwlxCommon.TDCB_ZQHKQK, new ZqhkqkServiceImpl());
        shangbaoMap.put(YwlxCommon.TDCB_CBXM, new CbxmServiceimpl());
        shangbaoMap.put(YwlxCommon.TDCB_ZJNDYS, new ZjndysServiceImpl());
        shangbaoMap.put(YwlxCommon.TDCB_XMWCQK, new XmwcqkServiceImpl());
        // 更多shangbao操作
    }

    public static Optional<Shangbao> getShangbao(String operator) {
        return Optional.ofNullable(shangbaoMap.get(operator));
    }
}
  • 详解--重构项目代码

上述的if/else或者switch,都是处理工作台的公共逻辑,以ywLx区分!当然也会在自己的业务界面处理服务。

  • 重构自身Ctrl

@RestController
@RequestMapping(value = "/cbxm")
public class CbxmController {
    @Autowired
    private CbxmService cbxmService;

    @RequestMapping(path = "/shangBao/{cbxmGuid}/{xmMc}", method = RequestMethod.GET)
    @OperateLogAnnotate(operation = "上报", ywLx = YwlxCommon.TDCB_CBXM, ywGuidField = "cbxmGuid", xmMcField = "xmMc")
    public ResponseBodyVo<Object> shangBao(@ApiParam("cbxmGuid")@PathVariable("cbxmGuid") String cbxmGuid, @ApiParam("xmMc")@PathVariable("xmMc") String xmMc) {
        ResponseBodyVo<Object> responseBodyVo = cbxmService.shangBao(cbxmGuid);
        return responseBodyVo;
    }
}



//=========================================================================

// 将自己代码的shangBao注释
public interface CbxmService extends Shangbao{
   
    // ResponseBodyVo<Object> shangBao(String xmGuid);
}



//=========================================================================
@Service
public class CbxmServiceimpl implements CbxmService {

	@Override
    @TxTransaction(isStart = true)
    @Transactional(rollbackFor = Exception.class)
    public ResponseBodyVo<Object> shangBao(String xmGuid) {
	
	......
	}
}
  • 重构公共Ctrl

@RestController
@RequestMapping(value = "/xmsb")
public class XmsbController {
    @Autowired
    private IXmsbService iXmsbService;
	
    @ApiOperation("上报的公共接口")
    @RequestMapping(value = "/shangbao/{xmGuid}/{xmMc}/{ywLx}", method = RequestMethod.GET)
    @OperateLogAnnotate(operation = "上报", ywLx = "ywLx", ywGuidField = "xmGuid", xmMcField = "xmMc")
    public ResponseBodyVo<Object> shangbao(@PathVariable("xmGuid") String xmGuid,
                                           @PathVariable("xmMc") String xmMc,
                                           @PathVariable("ywLx") String ywLx){
        System.out.println("shangbao");
        return iXmsbService.shangbao(xmGuid, ywLx);
    }
}
  • 重构公共interface

//public interface IXmsbService extends Shangbao{ --error 
public interface IXmsbService {

    ResponseBodyVo<Object> shangbao(String xmGuid, String ywLx);
}
  • 重构公共实现类



/**
 * @Created by xiongYiMing on 2019/5/22 0022 20:13
 */
@Service
@Transactional
public class XmsbServiceImpl implements IXmsbService {
   
    /**
     * 成功状态
     */
    String successStatus = "200";

    /*@Override
    @Transactional(rollbackFor = Exception.class)
    public ResponseBodyVo<Object> shangbao(String xmGuid, String ywLx) {

        ResponseBodyVo<Object> resultObj = new ResponseBodyVo<Object>();

        switch (ywLx) {
            case YwlxCommon.TDCB_ZXZQFXJH:
                TNewZxzq tNewZxzq = new TNewZxzq();
                tNewZxzq.setZxzqguid(xmGuid);
                resultObj = iZxzqFxjhService.shangBao(tNewZxzq, new Object());
                break;
            case YwlxCommon.TDCB_ZQSJFXJH:
                // 债券实际发行计划
                TNewzxzqfxqk tNewzxzqfxqk = new TNewzxzqfxqk();
                tNewzxzqfxqk.setFxqkGuid(xmGuid);
                resultObj = iZqsjfxqkService.shangBao(tNewzxzqfxqk, new Object());
                break;
            case YwlxCommon.TDCB_ZQHKQK:
                TNewzqhkqk tNewzqhkqk = new TNewzqhkqk();
                tNewzqhkqk.setZqhkqkGuid(xmGuid);
                resultObj = iZqhkqkService.shangBao(tNewzqhkqk, new Object());
                break;
            case YwlxCommon.TDCB_CBXM://储备项目
                Cbxm cbxm = new Cbxm();
                cbxm.setCbxmGuid(xmGuid);
                resultObj = cbxmService.shangBao(cbxm, new Object());
                break;
            case YwlxCommon.TDCB_ZJNDYS://资金年度预算
                Cbxmbdys cbxmbdys = new Cbxmbdys();
                cbxmbdys.setCbxmbdysGuid(xmGuid);
                resultObj = zjndysService.shangBao(cbxmbdys, new Object());
                break;
            case YwlxCommon.TDCB_XMWCQK://项目完成情况
                Cbxmwcqk cbxmwcqk = new Cbxmwcqk();
                cbxmwcqk.setWcqkGuid(xmGuid);
                resultObj = xmwcqkService.shangBao(cbxmwcqk, new Object());
                break;
            *//*case YwlxCommon.TDCB_NDTDJH:
                resultObj = ndcbtdjhService.shangbao(xmGuid);
                break;*//*
            default:
        }

        if (successStatus.equals(resultObj.getStatus().toString())) {
            // 1. 进行工作台操作
            resultObj = procesShenhe(resultObj, xmGuid, ywLx);
        }
        return resultObj;
    }*/
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ResponseBodyVo<Object> shangbao(String xmGuid, String ywLx) {
        Shangbao targetShangbao = ShangbaoFactory
                .getShangbao(ywLx)
                .orElseThrow(() -> new IllegalArgumentException("Invalid Operator"));
        return targetShangbao.shangBao(xmGuid);
    }

}

其他博客主的理解用法

发布了206 篇原创文章 · 获赞 49 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/Sicily_winner/article/details/98865026