▄︻┻┳═一Agenda:
▄︻┻┳═一(1/8)[代码整洁之道]你真的会用枚举吗?非也!
▄︻┻┳═一(2/8)枚举的错误用法 之 方法参数
▄︻┻┳═一(3/8)枚举的错误用法 之 方法参数(二)
▄︻┻┳═一(4/8)枚举的错误用法 之 方法返回值
▄︻┻┳═一(5/8)枚举的错误用法 之 方法体内部
▄︻┻┳═一(6/8)枚举的错误用法 之 分支判断
▄︻┻┳═一(7/8)借助枚举说一下数据类型定义规范
▄︻┻┳═一(8/8)RPC接口能用枚举就请考虑枚举
继续讲枚举的使用。本文举例说明方法的参数不用枚举所带来的蹩脚之处。
【先上代码】
先看如下方法:
private boolean updRpmRtulProcc(RpmRtulDO rpmRtulDO, String rfdSts) throws YGException { logger.infoFmt("修改退款订单状态为失败[{}]", RefundStsEnum.getBySts(rfdSts).getDesc()); rpmRtulDO.setRfdSts(rfdSts); ... ... return true; }
程序里对这个方法的调用:
if (!updRpmRtulProcc(rpmRtul, RefundStsEnum.RFD_CLEARING_PROC.getSts())) { ... ... }
如下是RefundStsEnum枚举类:
/** * 退款状态枚举 */ public enum RefundStsEnum { RFD_PROCESS("0","退款处理中"), RFD_SUCC("3","退款成功"), RFD_FAIL("4","退款失败"), RFD_CANCEL("7","退款取消"), RFD_CLEARING_PROC("8","退款清结算处理中"), RFD_ACCOUNTING_PROC("9","退款记账处理中"), REFUSE("R9", "审批拒绝"), RFD_APPROVAL("W3", "退款审批中"); private String sts; private String desc; RefundStsEnum(String sts, String desc) { this.sts = sts; this.desc = desc; } public String getSts() { return sts; } public String getDesc() { return desc; } public static RefundStsEnum getBySts(String sts) { for (RefundStsEnum type : values()) { if (type.getSts().equals(sts)) { return type; } } return null; } }
【重构方式】
上面方法中的String变量rfdSts,在程序里有定义对应的枚举类型RefundStsEnum。
本例是典型的枚举使用不当。症结在于将方法参数rfdSts定义成了String,这导致了两点不爽:
- 该方法内部,如第一行,打日志时,先调用枚举RefundStsEnum的getBySts(),将rfdSts所存的RefundStsEnum的sts转换成枚举RefundStsEnum,然后,获取它的desc。
- 调用该方法传的参数是RefundStsEnum.getSts()
正确的实现方式是:将方法参数rfdSts定义为枚举类型RefundStsEnum,自然,就不存在以上的不爽了。这样会很清晰!
private boolean updRpmRtulProcc(RpmRtulDO rpmRtulDO, RefundStsEnum rfdSts) throws YGException { logger.infoFmt("修改退款订单状态为失败[{}]", rfdSts.getDesc()); rpmRtulDO.setRfdSts(rfdSts.getSts()); ... ... return true; }