程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 高階Java-Java枚舉類型enum應用詳解

高階Java-Java枚舉類型enum應用詳解

編輯:關於JAVA

java的Enum枚舉類型終於在j2se1.5出現了。之前覺得它只不過是雞肋而已,可有可無。畢竟這麼多年來,沒有它,大家不都過得很好嗎?今日看《Thinking in Java》4th edition,裡面有一句話“有時恰恰因為它,你才能夠"優雅而干淨"地解決問題。優雅與清晰很重要,正式它們區別了成功的解決方案與失敗的解決方案。而失敗的解決方案就是因為其他人無法理他。"使用Enum枚舉類型,可以將以前笨拙的代碼變得優雅簡單?但是,我同時也在思考另外一個問題,使用新的技術,會不會給技術人員帶來更多的負擔呢?

"學習新版語言的一個危險就是瘋狂使用新的語法結構"

先學習一下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 [email protected] 
 * 
 */ 
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<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));
 }
 }

}

為每個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());
 }
 }

}

以下內容可能有些無聊,但絕對值得一窺

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多路分發

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved