(6/8)枚舉的錯誤用法 之 分支判斷

▄︻┻┳═一Agenda:html

▄︻┻┳═一(1/8)[代碼整潔之道]你真的會用枚舉嗎?非也!app

▄︻┻┳═一(2/8)枚舉的錯誤用法 之 方法參數post

▄︻┻┳═一(3/8)枚舉的錯誤用法 之 方法參數(二)this

▄︻┻┳═一(4/8)枚舉的錯誤用法 之 方法返回值url

▄︻┻┳═一(5/8)枚舉的錯誤用法 之 方法體內部spa

▄︻┻┳═一(6/8)枚舉的錯誤用法 之 分支判斷code

▄︻┻┳═一(7/8)藉助枚舉說一下數據類型定義規範htm

▄︻┻┳═一(8/8)RPC接口能用枚舉就請考慮枚舉blog


 

 

繼續講枚舉的使用。前文說的是方法參數和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;
    }
}
相關文章
相關標籤/搜索