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