java使用枚举类去除部分if else

28 阅读2分钟

枚举类

一般用于存储常量信息,通常用法就是去除项目中的 魔法值 ,第一份工作的时候使用阿里的代码规范检测工具就报出一大堆魔法值,一般情况就使用枚举类去存储这些魔法值,然后统一的进行维护,从而提高代码的可读性,对后期的项目维护也提供一定的帮助。

问题

最近在公司看到份之前同事写的老代码,发现只是把枚举类作为一个常量值去进行使用,然后写一大堆的 if else 判断然后进行赋值。
大致的代码如下:

// 枚举类代码
public enum AsyncExportProjectEnum {

    START("start","开始导出"),

    CONDUCTED("conducted","进行中"),

    FAIL("fail","失败"),

    END("end","结束");

    private String code;

    private String name;

    AsyncExportProjectEnum(String code, String name){
        this.code = code;
        this.name = name;
    }

    public String getCode() {
        return code;
    }
    public String getName() {
        return name;
    }
}

上面是枚举类的代码,他已经把枚举类中的 getCode,getName 方法写好了,但是没有充分的利用,之前同事的代码也是写了一个方法判断当前的流程处于哪个阶段,大致代码如下:

if(AsyncExportProjectEnum.START.getCode().equals(type)){
    // 执行开始任务
}else if(AsyncExportProjectEnum.CONDUCTED.getCode().equals(type)){
    //  执行中代码
}else if(AsyncExportProjectEnum.END.getCode().equals(type)){
    //  执行结束代码 
}else{
    // 报错代码
}

这里把枚举中的每一个值都进行判断,同时这个 type 其实就是 AsyncExportProjectEnum 中的一个值而已,然后通过type的值和 code 比较然后给 info 对象赋上对应的 name ,这样的写法完全是拿枚举类作为一个常量去使用,并且 ,其实可以直接把它当作一个参数使用,改造一下之后:

private void  getAsyncExportProjectEnumName(AsyncExportProjectEnum asyncExportProjectEnum,String type){
    if(asyncExportProjectEnum.getCode().equals(type)){
        // 执行对应代码
    }
}

这里的前提是在调用这个方法之前就已经知道了我该走哪一个枚举的类型分支,只是在这里做个判断然后具体执行而已。