在项目重构时,对数据状态、字典等字段的描述(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条件筛选等),使用枚举,编译期间限定类型,不允许发生越界。
网友评论