高階Java枚舉類型enum使用詳解

來源:互聯網
上載者:User

  高階Java枚舉類型enum使用詳解 收藏
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 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());

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

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/hakunamatata2008/archive/2010/12/11/6070003.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.