• (6/8)枚举的错误用法 之 分支判断


    ▄︻┻┳═一Agenda:

    ▄︻┻┳═一(1/8)[代码整洁之道]你真的会用枚举吗?非也!

    ▄︻┻┳═一(2/8)枚举的错误用法 之 方法参数

    ▄︻┻┳═一(3/8)枚举的错误用法 之 方法参数(二)

    ▄︻┻┳═一(4/8)枚举的错误用法 之 方法返回值

    ▄︻┻┳═一(5/8)枚举的错误用法 之 方法体内部

    ▄︻┻┳═一(6/8)枚举的错误用法 之 分支判断

    ▄︻┻┳═一(7/8)借助枚举说一下数据类型定义规范

    ▄︻┻┳═一(8/8)RPC接口能用枚举就请考虑枚举


    继续讲枚举的使用。前文说的是方法参数和pojo属性定义成枚举类型的好处。本文讲在方法内部的分支判断的场景下使用枚举的正确方式。

    【先上代码】

    private boolean riskCheck(RefundReqBO refundReq, RefundRspBO refundRsp, RpmOrdDO rpmOrd, RpmRtulDO rpmRtul) throws YGException {
    
        ... ...
        
        String apprSts = realTimeRiskCheckRsp.getApprSts();//风控审批状态
        String nmlSts = realTimeRiskCheckRsp.getNmlSts();//名单状态
        logger.infoFmt("风控检查结果[风控审批状态={},名单状态={}]",apprSts,nmlSts);
    
        YGPubUtil.copyProperties(rpmRtul,rpmOrd);
        boolean passFlg = false;
        boolean notifyFlg = false;
        if(StringUtils.equals(apprSts, ApprStsEnum.REFUSE.getValue())) {
            //拒绝 登记退款订单
            rpmRtul.setRskApprSts(ApprStsEnum.REFUSE.getValue());//风控拒绝
            rpmRtul.setRfdSts(RefundStsEnum.REFUSE.getSts());//审批拒绝
            refundRsp.setMsgCd(realTimeRiskCheckRsp.getWarnCd());
            refundRsp.setMsgInf(realTimeRiskCheckRsp.getWarnCd());
            
            ... ...
        
        }else if(StringUtils.equals(apprSts,ApprStsEnum.APPROVAL.getValue())) {
            //审批 更新消费订单 登记退款订单 返回
            logger.info("风控检查riskCheck ------> 进入审批");
            int retCod = rpmOrdService.updateOrdStsByPrimaryKey(... ...);
            if(retCod!=1){
                refundRsp.setMsg(RPMMessageCodeEnum.FAILED_TO_UPDATE_PAYMENT_ORDER);
                return false;
            }
            rpmRtul.setRskApprSts("1");//风控审批中
            rpmRtul.setRfdSts(RefundStsEnum.RFD_APPROVAL.getSts());//退款审批中
            notifyFlg = true;
        }else{
            //通过,继续
            logger.info("风控检查riskCheck ------> 通过");
            passFlg = true ;
        }
            
        ... ...
        
    }

    【重构方式】

    为了紧扣主题,所以这里只聚焦于上面方法里的变量apprSts。

    我们看,上面的分支判断if...else if...else里,条件都是基于apprSts与枚举ApprStsEnum比较来进行逻辑判断的。那么,对于这种情况,从代码整洁度的角度来讲,应把apprSts定义为枚举类型ApprStsEnum,这时的分支判断就显得清晰多了。

    private boolean riskCheck(RefundReqBO refundReq, RefundRspBO refundRsp, RpmOrdDO rpmOrd, RpmRtulDO rpmRtul) throws YGException {
    
        ... ...
        
        ApprStsEnum apprSts = ApprStsEnum.getByValue(realTimeRiskCheckRsp.getApprSts());//风控审批状态
        String nmlSts = realTimeRiskCheckRsp.getNmlSts();//名单状态
        logger.infoFmt("风控检查结果[风控审批状态={},名单状态={}]",apprSts,nmlSts);
    
        YGPubUtil.copyProperties(rpmRtul,rpmOrd);
        boolean passFlg = false;
        boolean notifyFlg = false;
        switch (apprSts) {
            case REFUSE:
                //拒绝 登记退款订单
                rpmRtul.setRskApprSts(ApprStsEnum.REFUSE.getValue());//风控拒绝
                rpmRtul.setRfdSts(RefundStsEnum.REFUSE.getSts());//审批拒绝
                refundRsp.setMsgCd(realTimeRiskCheckRsp.getWarnCd());
                refundRsp.setMsgInf(realTimeRiskCheckRsp.getWarnCd());
                
                ... ...
        
                break;
            case APPROVAL:
                //审批 更新消费订单 登记退款订单 返回
                logger.info("风控检查riskCheck ------> 进入审批");
                int retCod = rpmOrdService.updateOrdStsByPrimaryKey(... ...);
                if(retCod!=1){
                    refundRsp.setMsg(RPMMessageCodeEnum.FAILED_TO_UPDATE_PAYMENT_ORDER);
                    return false;
                }
                rpmRtul.setRskApprSts("1");//风控审批中
                rpmRtul.setRfdSts(RefundStsEnum.RFD_APPROVAL.getSts());//退款审批中
                notifyFlg = true;
                break;
            default:
                //通过,继续
                logger.info("风控检查riskCheck ------> 通过");
                passFlg = true ;
                break;
        }
            
        ... ...
        
    }

     同时,ApprStsEnum里新建静态方法getByValue:

    public enum ApprStsEnum {
        ADOPT("0", "通过"),
        APPROVAL("4", "审批"),
        REFUSE("9", "拒绝");
    
        private final String value;
        private final String name;
    
        private ApprStsEnum(String value, String name) {
            this.value = value;
            this.name = name;
        }
    
        public String getValue() {
            return this.value;
        }
    
        public String getName() {
            return this.name;
        }
        
        public static ApprStsEnum getByValue(String value) {
            if (StringUtils.isBlank(value)) {
                return null;
            }
            for (ApprStsEnum item : ApprStsEnum.values()) {
                if (value.equalsIgnoreCase(item.getValue())) {
                    return item;
                }
            }
            return null;
        }
    }
  • 相关阅读:
    SharePoint 2010 新体验3 文档集
    Firebird 修改表名
    C++Builder XE7 up1 简单测试
    Firbird 将可 null 的列更新为 not null
    用delphiXE7 dbExpress Framework提供的功能获取数据表信息
    Linux的基本命令总结
    IOS 隐藏时间条
    最大流 ZQUOJ 10181 && POJ 1273
    最大二分匹配 匈牙利算法模板&&POJ 1469 COURSES
    新加坡第四天下午
  • 原文地址:https://www.cnblogs.com/buguge/p/9554583.html
Copyright © 2020-2023  润新知