java的Enum枚舉類型終於在j2se1.5出現了。以前以爲它只不過是雞肋而已,無關緊要。畢竟這麼多年來,沒有它,你們不都過得很好嗎?今日看《Thinking in Java》4th edition,裏面有一句話「有時偏偏由於它,你纔可以"優雅而乾淨"地解決問題。優雅與清晰很重要,正式它們區別了成功的解決方案與失敗的解決方案。而失敗的解決方案就是由於其餘人沒法理他。"使用Enum枚舉類型,能夠將之前笨拙的代碼變得優雅簡單?可是,我同時也在思考另一個問題,使用新的技術,會不會給技術人員帶來更多的負擔呢? java
"學習新版語言的一個危險就是瘋狂使用新的語法結構" 程序員
先學習一下enum的簡單應用,如下簡潔的代碼已經包括enum所提供的絕大部分功能。 設計模式
1.enum的應用,包括定義,遍歷,switch,enumset,enummap等 安全
Java代碼
package com.janeky.enumtest;
import java.util.EnumMap;
import java.util.EnumSet;
/**
* Java枚舉類型enum使用詳解
* @version 2009/9/5
* @author janeky
* @mail rojaneky@gmail.com
*
*/
public class EnumTest {
//定義一個enum枚舉類型,包括兩個實例ON,OFF
public enum State {
ON, OFF
};
//測試函數
public static void main(String[] args) {
//直接變量enum
for (State s : State.values())
System.out.println(s.name());
//switch與enum的結合使用
State switchState = State.OFF;
switch (switchState) {
case OFF:
System.out.println("OFF");
break;
case ON:
System.out.println("ON");
break;
}
//EnumSet的使用
EnumSet stateSet = EnumSet.allOf(State.class);
for (State s : stateSet) {
System.out.println(s);
}
//EnumMap的使用
EnumMap stateMap = new EnumMap(
State.class);
stateMap.put(State.ON, "is On");
stateMap.put(State.OFF, "is off");
for (State s : State.values()) {
System.out.println(s.name() + ":" + stateMap.get(s));
}
}
}
package com.janeky.enumtest;
import java.util.EnumMap;
import java.util.EnumSet; 函數
/**
* Java枚舉類型enum使用詳解
* @version 2009/9/5
* @author janeky
* @mail rojaneky@gmail.com
*
*/
public class EnumTest { 學習
//定義一個enum枚舉類型,包括兩個實例ON,OFF
public enum State {
ON, OFF
}; 測試
//測試函數
public static void main(String[] args) {
//直接變量enum
for (State s : State.values())
System.out.println(s.name()); .net
//switch與enum的結合使用
State switchState = State.OFF;
switch (switchState) {
case OFF:
System.out.println("OFF");
break;
case ON:
System.out.println("ON");
break;
} 設計
//EnumSet的使用
EnumSet stateSet = EnumSet.allOf(State.class);
for (State s : stateSet) {
System.out.println(s);
} 對象
//EnumMap的使用
EnumMap stateMap = new EnumMap(
State.class);
stateMap.put(State.ON, "is On");
stateMap.put(State.OFF, "is off");
for (State s : State.values()) {
System.out.println(s.name() + ":" + stateMap.get(s));
}
}
}
爲每一個enum實例定義不一樣的方法
Java代碼
package com.janeky.enumtest;
public enum TestEnumMathod {
//爲每一個enum實例添加不一樣的實現方法
SAMPLE1 {
String getInfo() {
return "SAMPLE1";
}
},
SAMPLE2{
String getInfo()
{
return "SAMPLE2";
}
};
abstract String getInfo();
//測試
public static void main(String args[])
{
for(TestEnumMathod method:values())
{
System.out.println(method.getInfo());
}
}
}
package com.janeky.enumtest;
public enum TestEnumMathod {
//爲每一個enum實例添加不一樣的實現方法
SAMPLE1 {
String getInfo() {
return "SAMPLE1";
}
},
SAMPLE2{
String getInfo()
{
return "SAMPLE2";
}
};
abstract String getInfo();
//測試
public static void main(String args[])
{
for(TestEnumMathod method:values())
{
System.out.println(method.getInfo());
}
}
}
如下內容可能有些無聊,但絕對值得一窺
1.
public class State {
public static final int ON = 1;
public static final Int OFF= 0;
}
有什麼很差了,你們都這樣用了很長時間了,沒什麼問題啊。
首先,它不是類型安全的。你必須確保是int
其次,你還要確保它的範圍是0和1
最後,不少時候你打印出來的時候,你只看到 1 和0 ,
但其沒有看到代碼的人並不知道你的企圖
so,拋棄你全部舊的public static final常量吧
2.能夠建立一個enum類,把它看作一個普通的類。除了它不能繼承其餘類了。(java是單繼承,它已經繼承了Enum),
能夠添加其餘方法,覆蓋它自己的方法
3.switch()參數能夠使用enum了
4.values()方法是編譯器插入到enum定義中的static方法,因此,當你將enum實例向上轉型爲父類Enum是,values()就不可訪問了。解決辦法:在Class中有一個getEnumConstants()方法,因此即使Enum接口中沒有values()方法,咱們仍然能夠經過Class對象取得全部的enum實例
5.沒法從enum繼承子類,若是須要擴展enum中的元素,在一個接口的內部,建立實現該接口的枚舉,以此將元素進行分組。達到將枚舉元素進行分組。
6.使用EnumSet代替標誌。enum要求其成員都是惟一的,可是enum中不能刪除添加元素。
7.EnumMap的key是enum,value是任何其餘Object對象。
8.enum容許程序員爲eunm實例編寫方法。因此能夠爲每一個enum實例賦予各自不一樣的行爲。
9.使用enum的職責鏈(Chain of Responsibility) .這個關係到設計模式的職責鏈模式。以多種不一樣的方法來解決一個問題。而後將他們連接在一塊兒。當一個請求到來時,遍歷這個鏈,直到鏈中的某個解決方案可以處理該請求。
10.使用enum的狀態機
11.使用enum多路分發