为什么使用枚举?

为什么使用枚举?

在项目重构时,对数据状态、字典等字段的描述(type、status等)我会在系统中使用枚举来表示,为什么我们要使用枚举呢?

枚举例子

public enum CompanyEnum {

    SUBSISTING("subsisting","存续"),

    EMPLOYED("employed","在业"),

    REVOKE("revoke","吊销"),

    ANNUL("annul","注销"),

    MOVING("moving","迁入"),

    EMIGRATION("emigration","迁出"),

    SHUTOUT("shutout","停业"),

    LIQUIDATE("liquidate","清算");

    private final String key;

    private final String value;

    private CompanyEnum (String key,String value){
        this.key = key;
        this.value = value;
    }

    /**
     * 根据key获取枚举
     * @param key
     * @return
     */
    public static CompanyEnum getEnumByKey(String key){
        if(null == key){
            return null;
        }
        for(CompanyEnum temp:CompanyEnum.values()){
            if(temp.getKey().equals(key)){
                return temp;
            }
        }
        return null;
    }

    public String getKey() {
        return key;
    }

    public String getValue() {
        return value;
    }
    
}

枚举优点

增强代码可读性
....
entity.setCompanyStatus(1);
....

上述代码向实体插入了一个状态“1”,由int类型表示,在重构项目时,如果没有注释我们很难知道这是什么?使用枚举:

....
// 设置公司状态
entity.setCompanyStatus(CompanyEnum.getEnumByKey("employed"))
....

当实际使用时,我们可以进入到CompanyEnum中查看状态对应的中文描述,以此来提高代码可阅读性。

传递参数错误

向上述状态值为int,如果传递是一个负数,例如:

....
entity.setCompanyStatus(-1);
....

然而,我们并没有定义"-1"这个参数状态,在程序编译时可以通过,可实际是存在错误的,我们使用枚举,可以在定义枚举类时规避这样的问题。

去除equals两者判断

由于常量值地址唯一,使用枚举可以直接通过“==”进行两个值之间的对比,性能会有所提高。

....
// 这样更耗费性能
if("status".equals(variable)) {
	...
}
....

// 使用枚举,提高性能
if(CompanyEnum.getEnumByKey("employed") == variable) {
	....
}
编译优势(与常量类相比)

常量类编译时,常量被直接编译进二进制代码中,常量值在升级中变化后,需要重新编译引用常量的类,因为二进制代码中存放的是旧值。枚举类编译时,没有把常量值编译到代码中,即使常量值发生改变,也不会影响引用常量的类。

修改优势(与常量类相比)

枚举类编译后默认final class,不允许继承可防止被子类修改。常量类可被继承修改、增加字段等,易导致父类不兼容。

数据库兼容

枚举型可直接与数据库交互。

Switch语句优势

使用int、String类型switch时,当出现参数不确定的情况,偶尔会出现越界的现象,这样我们就需要做容错操作(if条件筛选等),使用枚举,编译期间限定类型,不允许发生越界。

猜你喜欢

转载自blog.csdn.net/Cy_LightBule/article/details/87913425