最近和同事討論的時候,突然同事提到為什麽在java中不使用穆恩枚舉類型來定義常量值,而是使用public final靜態類型來定義它們。過去我們都是這樣定義的,很少用enum定義,所以沒有重視。面對突如其來的問題,我們真的不知道為什麽會有這樣的定義。既然妳不懂,那就花點時間研究壹下。
Java中的枚舉類型是由關鍵字enum定義的,所有枚舉類型都是從Enum類型繼承的,Enum類型只是jdk1.5中的新類型。為了理解枚舉類型,我建議您在jdk中打開enum類並簡單閱讀壹下。這個類中定義了許多受保護的方法,例如構造函數。如果我們想使用這些方法,我們可以在當前類中定義枚舉類型。每種枚舉類型都有自己的名稱和順序。當我們輸出壹個枚舉類型時,我們將輸入該枚舉類型的名稱。有關詳細信息,請參考以下示例。
壹、通常定義常數的方法
我們通常使用public final靜態方法來定義代碼,如下所示:1表示紅燈,3表示綠燈,2表示黃燈。
包com . csdn . myenum;
公共類燈{
/*紅燈*/
public final靜態int RED = 1;
/*綠燈*/
public final static int GREEN = 3;
/*黃燈*/
public final static int YELLOW = 2;
}
其次,枚舉類型定義了常量方法
枚舉類型的簡單定義方法如下。似乎我們無法定義每個枚舉類型的值。例如,我們可以將紅燈、綠燈和黃燈的代碼定義如下:
公共枚舉燈{
紅色、綠色、黃色;
}
我們只能顯示紅燈、綠燈和黃燈,但無法顯示具體值。別擔心,由於枚舉類型提供了構造函數,我們可以通過構造函數和重寫toString方法來實現。首先將構造函數添加到Light枚舉類型中,然後通過構造函數將每個枚舉類型的值傳入相應的參數中,同時覆蓋toString方法,其中返回從構造函數傳入的參數。改革後的法典如下:
公共枚舉燈{
//使用構造函數傳遞參數
紅色(1)、綠色(3)、黃色(2);
//定義私有變量
private int nCode
//構造函數,枚舉類型只能是私有的。
專用燈(int _ nCode ){
這個。nCode = _ nCode
}
@覆蓋
公共字符串toString(){
返回string . value of(this。nCode);
}
}
第三,完整的示例代碼
枚舉類型的完整演示代碼如下:
包com . csdn . myenum;
導入Java . util . enum map;
導入Java . util . enum set;
公共類燈光測試{
// 1.定義枚舉類型
公共枚舉燈{
//使用構造函數傳遞參數
紅色(1)、綠色(3)、黃色(2);
//定義私有變量
private int nCode
//構造函數,枚舉類型只能是私有的。
專用燈(int _ nCode ){
這個。nCode = _ nCode
}
@覆蓋
公共字符串toString(){
返回string . value of(this。nCode);
}
}
/**
* @param args
*/
公共靜態void main(String【】args ){
// 1.遍歷枚舉類型
系統。出去。println(“演示枚舉類型的遍歷…”);
testTraversalEnum();
// 2.演示EnumMap對象的使用。
系統。出去。println(“演示EnmuMap對象的使用和遍歷。。。“);
testEnumMap();
// 3.演示如何使用EnmuSet
系統。出去。println(“演示EnmuSet對象的使用和遍歷。。。“);
testEnumSet();
}
/**
*演示枚舉類型的遍歷。
*/
私有靜態void testTraversalEnum(){
light【】all light = light . values();
對於(燈亮:全亮){
系統。出去。println(“當前燈名:“+align . name());
系統。出去。println(“當前燈序數:“+light . ordinal());
系統。出去。println(“當前燈:“+點亮“);
}
}
/**
*演示EnumMap的使用,它類似於HashMap的使用,只是鍵是枚舉類型。
*/
私有靜態void testEnumMap(){
// 1.演示EnumMap對象的定義。EnumMap對象的構造函數需要傳入參數,默認值是key的類類型。
EnumMap & lt燈,弦& gtcurrEnumMap = new EnumMap & lt燈,弦& gt(
光。類);
current map . put(Light。紅色,“紅燈”);
current map . put(Light。綠色,“綠燈”);
current map . put(Light。黃色,“黃燈”);
// 2.遍歷對象
for(Light Light:Light . values()){
系統。出去。println(“【key =“+light . name()+“,value=“
+current map . get(light)+“】““;
}
}
/**
*演示如何使用抽象類EnumSet獲取類型的枚舉類型內容
*您可以使用allOf方法。
*/
私有靜態void testenum set(){
EnumSet & lt光& gtcurrenum set = enum set . allof(Light。類);
for(lightsetelement:currEnumSet ){
系統。出去。println(“當前EnumSet中的數據為:“+aLightSetElement“);
}
}
}
實施結果如下:
演示枚舉類型的遍歷。......
當前燈名:紅色
當前燈序號:0
當前光線:1
當前燈名:綠色
當前燈序號:1
當前燈光:3
當前燈名:黃色
當前燈序號:2
當前燈光:2
演示EnmuMap對象的使用和遍歷。.....
【鍵=紅色,值=紅燈】
【鍵=綠色,值=綠燈】
【鍵=黃色,值=黃燈】
演示EnmuSet對象的使用和遍歷。.....
EnumSet中的當前數據為:1。
當前枚舉集中的數據是:3
當前枚舉集中的數據是:2
第四,常用的定義常數的方法與枚舉法定義常數的區別。
下面的內容可能很無聊,但絕對值得壹瞥。
1.代碼:
公共類狀態{
public靜態final int ON = 1;
公共靜態最終Int OFF = 0;
}
有什麽不好?大家都用了很久了。沒毛病。
首先,它不是類型安全的。妳必須確保它是int
其次,妳應該確保它的範圍是0和1。
最後,很多時候打印出來只看到1和0。
但是沒有看到代碼的人不知道妳想做什麽,並放棄了所有舊的公共靜態final常量。
2.您可以創建壹個enum類並將其視為普通類。除了它不能繼承其他類。(java是單壹繼承,它繼承了Enum),
您可以添加其他方法來重寫它自己的方法。
3.switch()參數可以使用枚舉。
4.values()方法是編譯器插入到枚舉定義中的靜態方法。因此,當您將枚舉實例轉換為父類枚舉時,values()不可訪問。解決方案:類中有壹個getenumConstants()方法,因此即使Enum接口中沒有values()方法,我們仍然可以通過類對象獲取所有Enum實例。
5.您不能從enum繼承子類。如果需要擴展enum中的元素,請創建壹個在接口內實現接口的枚舉來對元素進行分組。對枚舉元素進行分組。
6.使用EnumSet而不是標誌。枚舉要求其成員是唯壹的,但不能在枚舉中刪除添加的元素。
7.enummap的鍵是enum,值是任何其他對象。
Enum允許程序員為eunm實例編寫方法。因此,每個枚舉實例可以被賦予不同的行為。
9.使用enum的責任鏈,這與設計模式有關。用許多不同的方法解決問題。然後將它們連接在壹起。當請求到達時,遍歷鏈,直到鏈中的解決方案可以處理該請求。
10.使用枚舉的狀態機
11.使用enum進行多路分配。