作為Sun引入的新關鍵字,Enum看起來像壹個特殊的類。它還可以擁有自己的變量、定義自己的方法並實現壹個或多個接口。當我們聲明壹個枚舉類型時,我們應該註意到該枚舉類型具有以下特征。
1.它不能有公共構造函數,這可以確保客戶端代碼不能創建enum的新實例。
2.所有枚舉值都是公共的、靜態的、最終的。請註意,這僅適用於枚舉值。我們可以像在普通類中定義變量壹樣定義任何其他類型的非枚舉變量,並且這些變量可以使用您想要的任何修飾符。
3.默認情況下,enum實現java.lang.Comparable接口。
4.enum重寫了toString方法,因此如果我們調用Color。默認情況下將返回字符串“Blue”。
5.enum提供valueOf方法,該方法對應於toString方法。調用value of(“Blue“)將返回顏色。因此,我們在自己重寫toString方法時應該註意這壹點,並且我們應該相應地重寫valueOf方法。
6.enum還提供了values方法,使您可以輕松地遍歷所有枚舉值。
7.enum還有壹個oridinal方法,該方法返回枚舉類中枚舉值的順序,該順序取決於枚舉值的聲明順序,其中Color。Red.ordinal()返回0。
了解了這些基本功能後,讓我們看看如何使用它們。
1.遍歷所有枚舉值。了解了values方法,我們就可以熟練地使用ForEach循環遍歷枚舉值。
for(Color c:Color . values())
System.out.println(“查找值:“+c“);
2.在枚舉中定義方法和變量。例如,我們可以為Color添加壹個隨機返回顏色的方法。
公共枚舉顏色{
紅色,
綠色,
藍色;
私有靜態int number = Color.values()。長度;
公共靜態顏色getRandomColor(){
long random = system . current time millis()% number;
開關((int)random ){
案例0:
返回顏色。紅色;
案例1:
返回顏色。綠色;
案例二:
返回顏色。藍色;
默認值:返回顏色。紅色;
}
}
}
可以看出,在枚舉類型中定義變量和方法與在普通類中定義方法和變量沒有什麽不同。唯壹需要註意的是變量和方法定義必須放在所有枚舉值定義之後,否則編譯器會給出錯誤。
3.Override)方法的toString,valueOf。
我們已經知道enum提供了toString、valueOf等方法,很多時候我們需要覆蓋默認的toString方法,那麽我們該如何處理enum呢?事實上,這與覆蓋普通類的toString方法沒有什麽不同。
….
公共字符串toString(){
切換(此){
紅色案例:
返回“顏色。紅色”;
綠色案例:
返回“顏色。綠色”;
藍色外殼:
返回“顏色。藍色“;
默認值:
返回“未知顏色”;
}
}
….
此時,我們可以看到此時用前面的遍歷代碼打印的內容是
顏色。紅色
顏色。格林(姓氏);綠色的
顏色。藍色
而不是
紅色
格林(姓氏);綠色的
藍色。
您可以看到toString確實是重載的。壹般來說,在重寫toString時,我們還應該重寫valueOf方法以保持它們彼此壹致。
4.使用構造函數
盡管enum不能有公共構造函數,但我們仍然可以定義壹個私有構造函數在enum內部使用。讓我們以顏色為例。
公共枚舉顏色{
紅色(“這是紅色”),
綠色(“這是綠色”),
藍色(“這是藍色”);
私弦desc;
顏色(字符串desc ){
this . desc = desc;
}
公共字符串get desc(){
返回this.desc
}
}
這裏我們為每種顏色提供壹個描述信息,然後定義壹個構造函數來接受這個描述信息。
請註意,這裏的構造函數不能是公共的或受保護的,以確保該構造函數只能在內部使用,並且客戶端代碼不能創建枚舉值的實例。這也是完全合理的,因為我們知道枚舉值是public static final的常數。
5.實現特定的接口
我們已經知道enum可以定義變量和方法,它對接口的實現與普通類的實現是相同的,所以這裏就不舉例了。
6.定義您自己的枚舉值的方法。
正如我們前面看到的,我們可以為enum定義壹些方法。事實上,我們甚至可以為每個枚舉值定義方法。這樣,我們之前重寫toString的示例可以重寫為這樣。
公共枚舉顏色{
紅色{
公共字符串toString(){
返回“顏色。紅色”;
}
},
綠色{
公共字符串toString(){
返回“顏色。綠色”;
}
},
藍色{
公共字符串toString(){
返回“顏色。藍色“;
}
};
}
從邏輯上講,這比最初的“全局”toString方法更清晰。
總的來說,enum作為壹個新定義的類型,希望能幫助程序員寫出更簡單易懂的代碼。
人們認為通常沒有必要過多使用enum的某些高級功能,否則將違背易於理解的初衷。