- 相關(guān)推薦
詳解Java枚舉類(lèi)型enum及其使用
Java 中的枚舉類(lèi)型采用關(guān)鍵字enum 來(lái)定義,從jdk1.5才有的新類(lèi)型,所有的枚舉類(lèi)型都是繼承自Enum 類(lèi)型。以下是百分網(wǎng)小編搜索整理的關(guān)于Java枚舉類(lèi)型enum詳解及其使用,,需要的朋友可以參考本文!想了解更多相關(guān)信息請持續關(guān)注我們應屆畢業(yè)生考試網(wǎng)!
要了解枚舉類(lèi)型,建議大家先打開(kāi)jdk 中的Enum 類(lèi)簡(jiǎn)單讀一下,這個(gè)類(lèi)里面定義了很多protected 方法,比如構造函數,如果要使用這些方法我們可以把枚舉類(lèi)型定義到當前類(lèi)中。每個(gè)枚舉類(lèi)型,都有自己的名字和順序,當我們輸出一個(gè)枚舉類(lèi)型的時(shí)候,會(huì )輸入枚舉類(lèi)型的name ,具體可以參考下面的例子。
一、通常定義常量方法
我們通常利用public final static 方法定義的代碼如下,分別用1 表示紅燈,3 表示綠燈,2 表示黃燈。
package com.csdn.myEnum;
public class Light {
/* 紅燈 */
public final static int RED =1;
/* 綠燈 */
public final static int GREEN =3;
/* 黃燈 */
public final static int YELLOW =2;
}
二、枚舉類(lèi)型定義常量方法
枚舉類(lèi)型的簡(jiǎn)單定義方法如下,我們似乎沒(méi)辦法定義每個(gè)枚舉類(lèi)型的值。比如我們定義紅燈、綠燈和黃燈的代碼可能如下:
public enum Light {
RED , GREEN , YELLOW ;
}
我們只能夠表示出紅燈、綠燈和黃燈,但是具體的值我們沒(méi)辦法表示出來(lái)。別急,既然枚舉類(lèi)型提供了構造函數,我們可以通過(guò)構造函數和覆寫(xiě)toString 方法來(lái)實(shí)現。首先給Light 枚舉類(lèi)型增加構造方法,然后每個(gè)枚舉類(lèi)型的值通過(guò)構造函數傳入對應的參數,同時(shí)覆寫(xiě)toString 方法,在該方法中返回從構造函數中傳入的參數,改造后的代碼如下:
public enum Light {
// 利用構造函數傳參
RED (1), GREEN (3), YELLOW (2);
// 定義私有變量
private int nCode ;
// 構造函數,枚舉類(lèi)型只能為私有
private Light( int _nCode) {
this . nCode = _nCode;
}
@Override
public String toString() {
return String.valueOf ( this . nCode );
}
}
三、完整示例代碼
枚舉類(lèi)型的完整演示代碼如下:
package com.csdn.myEnum;
import java.util.EnumMap;
import java.util.EnumSet;
public class LightTest {
// 1. 定義枚舉類(lèi)型
public enum Light {
// 利用構造函數傳參
RED (1), GREEN (3), YELLOW (2);
// 定義私有變量
private int nCode ;
// 構造函數,枚舉類(lèi)型只能為私有
private Light( int _nCode) {
this . nCode = _nCode;
}
@Override
public String toString() {
return String.valueOf ( this . nCode );
}
}
/**
* @param args
*/
public static void main(String[] args ) {
// 1. 遍歷枚舉類(lèi)型
System. out .println( " 演示枚舉類(lèi)型的遍歷 ......" );
testTraversalEnum ();
// 2. 演示 EnumMap 對象的使用
System. out .println( " 演示 EnmuMap 對象的使用和遍歷 ....." );
testEnumMap ();
// 3. 演示 EnmuSet 的使用
System. out .println( " 演示 EnmuSet 對象的使用和遍歷 ....." );
testEnumSet ();
}
/**
* 演示枚舉類(lèi)型的遍歷
*/
private static void testTraversalEnum() {
Light[] allLight = Light.values ();
for (Light aLight : allLight) {
System. out .println( " 當前燈 name : " + aLight.name());
System. out .println( " 當前燈 ordinal : " + aLight.ordinal());
System. out .println( " 當前燈: " + aLight);
}
}
/**
* 演示 EnumMap 的使用, EnumMap 跟 HashMap 的使用差不多,只不過(guò) key 要是枚舉類(lèi)型
*/
private static void testEnumMap() {
// 1. 演示定義 EnumMap 對象, EnumMap 對象的構造函數需要參數傳入 , 默認是key 的類(lèi)的類(lèi)型
EnumMap
Light. class );
currEnumMap.put(Light. RED , " 紅燈 " );
currEnumMap.put(Light. GREEN , " 綠燈 " );
currEnumMap.put(Light. YELLOW , " 黃燈 " );
// 2. 遍歷對象
for (Light aLight : Light.values ()) {
System. out .println( "[key=" + aLight.name() + ",value="
+ currEnumMap.get(aLight) + "]" );
}
}
/**
* 演示 EnumSet 如何使用, EnumSet 是一個(gè)抽象類(lèi),獲取一個(gè)類(lèi)型的枚舉類(lèi)型內容
* 可以使用 allOf 方法
*/
private static void testEnumSet() {
EnumSet
for (Light aLightSetElement : currEnumSet) {
System. out .println( " 當前 EnumSet 中數據為: " + aLightSetElement);
}
}
}
執行結果如下:
演示枚舉類(lèi)型的遍歷 ......
當前燈 name : RED
當前燈 ordinal : 0
當前燈: 1
當前燈 name : GREEN
當前燈 ordinal : 1
當前燈: 3
當前燈 name : YELLOW
當前燈 ordinal : 2
當前燈: 2
演示 EnmuMap 對象的使用和遍歷 .....
[key=RED,value= 紅燈 ]
[key=GREEN,value= 綠燈 ]
[key=YELLOW,value= 黃燈 ]
演示 EnmuSet 對象的使用和遍歷 .....
當前 EnumSet 中數據為: 1
當前 EnumSet 中數據為: 3
當前 EnumSet 中數據為: 2
四、通常定義常量方法和枚舉定義常量方法區別
以下內容可能有些無(wú)聊,但絕對值得一窺
1. 代碼:
public class State {
public static final int ON = 1;
public static final Int OFF= 0;
}
有什么不好了,大家都這樣用了很長(cháng)時(shí)間了,沒(méi)什么問(wèn)題啊。
首先,它不是類(lèi)型安全的。你必須確保是int
其次,你還要確保它的范圍是0 和1
最后,很多時(shí)候你打印出來(lái)的時(shí)候,你只看到 1 和0 ,
但其沒(méi)有看到代碼的人并不知道你的企圖,拋棄你所有舊的public static final 常量吧
2. 可以創(chuàng )建一個(gè)enum 類(lèi),把它看做一個(gè)普通的類(lèi)。除了它不能繼承其他類(lèi)了。(java 是單繼承,它已經(jīng)繼承了Enum),
可以添加其他方法,覆蓋它本身的方法
3. switch() 參數可以使用enum 了
4. values() 方法是編譯器插入到enum 定義中的static 方法,所以,當你將enum 實(shí)例向上轉型為父類(lèi)Enum是,values() 就不可訪(fǎng)問(wèn)了。解決辦法:在Class 中有一個(gè)getEnumConstants() 方法,所以即便Enum 接口中沒(méi)有values() 方法,我們仍然可以通過(guò)Class 對象取得所有的enum 實(shí)例
5. 無(wú)法從enum 繼承子類(lèi),如果需要擴展enum 中的元素,在一個(gè)接口的內部,創(chuàng )建實(shí)現該接口的枚舉,以此將元素進(jìn)行分組。達到將枚舉元素進(jìn)行分組。
6. 使用EnumSet 代替標志。enum 要求其成員都是唯一的,但是enum 中不能刪除添加元素。
7. EnumMap 的key 是enum ,value 是任何其他Object 對象。
8. enum 允許程序員為eunm 實(shí)例編寫(xiě)方法。所以可以為每個(gè)enum 實(shí)例賦予各自不同的行為。
9. 使用enum 的職責鏈(Chain of Responsibility) . 這個(gè)關(guān)系到設計模式的職責鏈模式。以多種不同的方法來(lái)解決一個(gè)問(wèn)題。然后將他們鏈接在一起。當一個(gè)請求到來(lái)時(shí),遍歷這個(gè)鏈,直到鏈中的某個(gè)解決方案能夠處理該請求。
10. 使用enum 的狀態(tài)機
11. 使用enum 多路分發(fā)
【詳解Java枚舉類(lèi)型enum及其使用】相關(guān)文章:
使用Java的枚舉類(lèi)型的方法10-19
Java/Android引用類(lèi)型及其使用分析08-08
Java不可變類(lèi)型的詳解09-10
Java內存區域的使用詳解08-28
講述java中enum的用法10-14
C語(yǔ)言的枚舉類(lèi)型知識07-22
Java基本數據類(lèi)型詳解08-20
Java為什么要枚舉06-30