java的Enum枚舉類型終于在j2se1.5出現(xiàn)了。之前覺(jué)得它只不過(guò)是雞肋而已,可有可無(wú)。畢竟這么多年來(lái),沒(méi)有它,大家不都過(guò)得很好嗎?今日看《Thinking in Java》4th edition,里面有一句話“有時(shí)恰恰因?yàn)樗?,你才能?優(yōu)雅而干凈"地解決問(wèn)題。優(yōu)雅與清晰很重要,正式它們區(qū)別了成功的解決方案與失敗的解決方案。而失敗的解決方案就是因?yàn)槠渌藷o(wú)法理他。"使用Enum枚舉類型,可以將以前笨拙的代碼變得優(yōu)雅簡(jiǎn)單?但是,我同時(shí)也在思考另外一個(gè)問(wèn)題,使用新的技術(shù),會(huì)不會(huì)給技術(shù)人員帶來(lái)更多的負(fù)擔(dān)呢?
"學(xué)習(xí)新版語(yǔ)言的一個(gè)危險(xiǎn)就是瘋狂使用新的語(yǔ)法結(jié)構(gòu)"
先學(xué)習(xí)一下enum的簡(jiǎn)單應(yīng)用,以下簡(jiǎn)潔的代碼已經(jīng)包括enum所提供的絕大部分功能。
1.enum的應(yīng)用,包括定義,遍歷,switch,enumset,enummap等
Java代碼
import java.util.EnumMap;
import java.util.EnumSet;
public class EnumTest {
// 定義一個(gè)enum枚舉類型,包括兩個(gè)實(shí)例ON,OFF
public enum State {
ON, OFF
};
// 測(cè)試函數(shù)
public static void main(String[] args) {
// 直接變量enum
for (State s : State.values())
System.out.println(s.name());
// switch與enum的結(jié)合使用
State switchState = State.OFF;
switch (switchState) {
case OFF:
System.out.println("OFF");
break;
case ON:
System.out.println("ON");
break;
}
// EnumSet的使用
EnumSet<State> stateSet = EnumSet.allOf(State.class);
for (State s : stateSet) {
System.out.println(s);
}
// EnumMap的使用
EnumMap<State,String> stateMap = new EnumMap<State,String>(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.aicent.test;
public enum TestEnumMathod {
// 為每個(gè)enum實(shí)例添加不同的實(shí)現(xiàn)方法
SAMPLE1 {
String getInfo() {
return "SAMPLE1";
}
},
SAMPLE2 {
String getInfo() {
return "SAMPLE2";
}
};
abstract String getInfo();
// 測(cè)試
public static void main(String args[]) {
for (TestEnumMathod method : values()) {
System.out.println(method.getInfo());
}
}
}
以下內(nèi)容可能有些無(wú)聊,但絕對(duì)值得一窺
1.代碼:
public class State {
public static final int ON = 1;
public static final Int OFF= 0;
}
有什么不好了,大家都這樣用了很長(zhǎng)時(shí)間了,沒(méi)什么問(wèn)題啊。
首先,它不是類型安全的。你必須確保是int
其次,你還要確保它的范圍是0和1
最后,很多時(shí)候你打印出來(lái)的時(shí)候,你只看到 1 和0 ,
但其沒(méi)有看到代碼的人并不知道你的企圖,拋棄你所有舊的public static final常量吧
2.可以創(chuàng)建一個(gè)enum類,把它看做一個(gè)普通的類。除了它不能繼承其他類了。(java是單繼承,它已經(jīng)繼承了Enum),
可以添加其他方法,覆蓋它本身的方法
3.switch()參數(shù)可以使用enum了
4.values()方法是編譯器插入到enum定義中的static方法,所以,當(dāng)你將enum實(shí)例向上轉(zhuǎn)型為父類Enum是,values()就不可訪問(wèn)了。解決辦法:在Class中有一個(gè)getEnumConstants()方法,所以即便Enum接口中沒(méi)有values()方法,我們?nèi)匀豢梢酝ㄟ^(guò)Class對(duì)象取得所有的enum實(shí)例
5.無(wú)法從enum繼承子類,如果需要擴(kuò)展enum中的元素,在一個(gè)接口的內(nèi)部,創(chuàng)建實(shí)現(xiàn)該接口的枚舉,以此將元素進(jìn)行分組。達(dá)到將枚舉元素進(jìn)行分組。
6.使用EnumSet代替標(biāo)志。enum要求其成員都是唯一的,但是enum中不能刪除添加元素。
7.EnumMap的key是enum,value是任何其他Object對(duì)象。
8.enum允許程序員為eunm實(shí)例編寫(xiě)方法。所以可以為每個(gè)enum實(shí)例賦予各自不同的行為。
9.使用enum的職責(zé)鏈(Chain of Responsibility) .這個(gè)關(guān)系到設(shè)計(jì)模式的職責(zé)鏈模式。以多種不同的方法來(lái)解決一個(gè)問(wèn)題。然后將他們鏈接在一起。當(dāng)一個(gè)請(qǐng)求到來(lái)時(shí),遍歷這個(gè)鏈,直到鏈中的某個(gè)解決方案能夠處理該請(qǐng)求。
10.使用enum的狀態(tài)機(jī)
11.使用enum多路分發(fā)
轉(zhuǎn)載自:http://blog.csdn.net/mqboss/article/details/5647851