欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

(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,这导致了两点不爽:

  1. 该方法内部,如第一行,打日志时,先调用枚举refundstsenum的getbysts(),将rfdsts所存的refundstsenum的sts转换成枚举refundstsenum,然后,获取它的desc。
  2. 调用该方法传的参数是refundstsenum.getsts()

正确的实现方式是:将方法参数rfdsts定义为枚举类型refundstsenum,自然,就不存在以上的不爽了。这样会很清晰!

private boolean updrpmrtulprocc(rpmrtuldo rpmrtuldo, refundstsenum rfdsts)
        throws ygexception {
    logger.infofmt("修改退款订单状态为失败[{}]", rfdsts.getdesc());
    rpmrtuldo.setrfdsts(rfdsts.getsts());
    
    ... ...
    
    return true;
}