首页 » 编写高质量代码:改善Java程序的151个建议 » 编写高质量代码:改善Java程序的151个建议全文在线阅读

《编写高质量代码:改善Java程序的151个建议》建议84:使用构造函数协助描述枚举项

关灯直达底部

一般来说,我们经常使用的枚举项只有一个属性,即排序号,其默认值是从0、1、2……这一点我们非常熟悉。但是除了排序号外,枚举还有一个(或多个)属性:枚举描述,它的含义是通过枚举的构造函数,声明每个枚举项(也就是枚举的实例)必须具有的属性和行为,这是对枚举项的描述或补充,目的是使枚举项表述的意义更加清晰准确。例如有这样的一段代码:


enum Season{

Spring("春"),Summer("夏"),Autumn("秋"),Winter("冬");

private String desc;

Season(String_desc){

desc=_desc;

}

//获得枚举描述

public String getDesc(){

return desc;

}

}


其枚举项是英文的,描述是中文的,如此设计使其表述的意义更加精确,方便了多个协作者共同引用该常量。若不考虑描述的使用(即访问getDesc方法),它与如下接口定义的描述则很相似:


interface Season{

//春

int Spring=0;

//夏

int Summer=1;

/*……*/

}


比较两段代码,很容易看出使用枚举项描述是一个很好的解决方案,非常简单、清晰。因为是一个描述(Description),那我们在开发时就可以赋予更多的含义了,比如可以通过枚举构造函数声明业务值,定义可选项,添加属性等,看如下代码:


enum Role{

Admin("管理员",new Lifetime(),new Scope()),

User("普通用户",new Lifetime(),new Scope());

//中文描述

private String name;

//角色的生命期

private Lifetime lifeTime;

//权限范围

private Scope scope;

Role(String_name, Lifetime_lt, Scope_scope){

name=_name;

lifeTime=_lt;

scope=_scope;

}

/*name、lifeTime、scope的get方法较简单,不再赘述*/

}


这是一个角色定义类,描述了两个角色:管理员(Admin)和普通用户(User),同时它还通过构造函数对这两个角色进行了描述:

name:表示的是该角色的中文名称。

lifeTime:表示的是该角色的生命期,也就是多长时间该角色失效。

scope:表示的是该角色的权限范围。

读者可以看出,这样一个描述可以使开发者对Admin、User两个常量有一个立体多维度的认知,有名称、生命期,还有范围,而且还可以在程序中方便地获得此类的属性。

推荐大家在枚举定义中为每个枚举项定义描述,特别是在大规模的项目开发中,大量的常量项定义使用枚举项描述比在接口常量或类常量中增加注释的方式友好得多,简洁得多。