▄︻┻┳═一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; } }