1. 程式人生 > >java中的列舉類和常量類的區別

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 {

//......

}

列舉類還有更加強大的功能,如新增欄位,方法,還可以對他進行遍歷訪問