java中的列舉類和常量類的區別
假如有一筆業務需要稽核,稽核狀態分:未稽核,稽核中,稽核通過,稽核不通過。我們在程式裡是否可以直接這麼寫:
if(state==1){//1代表未操作
//操作
}else{
//......
}
將狀態標識直接寫在程式碼裡面(硬編碼),只圖一時方便,卻是後患無窮,如果有一天你需要修改狀態標識,用0代表未稽核而不是1,你不得不將所有與該標識相關的程式碼都找出來一個個改,另外,在編碼過程中,標識輸入錯誤的概率是比較高的,一不小心把0輸入成了10,雖然不會提示任何編譯錯誤,但執行結果將是出乎人的意料的。
於是我們很快想到可以用常量代替:
publicstaticfinalintUNAUDIT = 0;
相關判斷程式碼則是:
if(state==CONSTANT.UNAUDIT){
//操作
}else{
//......
}
這段程式碼比硬編碼更加健壯容易維護,但是仍然有不足之處。
1、UNAUDIT是編譯期常量,如果其值被改變,那麼使用方需要重新編譯。
2、沒有簡便的方法獲取標識代表的字串描述。
於是我們用列舉類來代替常量。
publicenum AuditState {
UNAUDIT(1),
AUDITING(2),
AUDIT_SUCCESS(3),
AUDIT_FAIL(4);
privatefinalint statenum;
AuditState(int statenum){
this.statenum = statenum;
}
publicint getStatenum() {
return statenum;
}
}
呼叫如下:
if (state == AuditState.UNAUDIT.getStatenum()) {
//AuditState.UNAUDIT.toString()獲取字串描述
System.out.println(AuditState.UNAUDIT.toString() + "標識是 "
+ AuditState.UNAUDIT.getStatenum());
} else {
//......
}
列舉類還有更加強大的功能,如新增欄位,方法,還可以對他進行遍歷訪問