0
点赞
收藏
分享

微信扫一扫

(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:

@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;
}
}

 

举报

相关推荐

0 条评论