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