讀古今文學網 > 編寫高質量代碼:改善Java程序的151個建議 > 建議84:使用構造函數協助描述枚舉項 >

建議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兩個常量有一個立體多維度的認知,有名稱、生命期,還有範圍,而且還可以在程序中方便地獲得此類的屬性。

推薦大家在枚舉定義中為每個枚舉項定義描述,特別是在大規模的項目開發中,大量的常量項定義使用枚舉項描述比在接口常量或類常量中增加註釋的方式友好得多,簡潔得多。