(6/6)枚举的错误用法 之 分支判断
程序员文章站
2023-11-02 14:08:16
▄︻┻┳═一Agenda: ▄︻┻┳═一(1/6)[代码整洁之道]你真的会用枚举吗?非也! ▄︻┻┳═一(2/6)枚举的错误用法 之 方法参数 ▄︻┻┳═一(3/6)枚举的错误用法 之 方法参数(二) ▄︻┻┳═一(4/6)枚举的错误用法 之 方法返回值 ▄︻┻┳═一(5/6)枚举的错误用法 之 方 ......
▄︻┻┳═一agenda:
▄︻┻┳═一
▄︻┻┳═一
▄︻┻┳═一
▄︻┻┳═一
▄︻┻┳═一
▄︻┻┳═一
继续讲枚举的使用。本文举例说明方法的参数不用枚举所带来的蹩脚之处。
【先上代码】
先看如下方法:
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; }