【轉】java枚舉類型enum的使用

來源:互聯網
上載者:User

標籤:

原文網址:http://blog.csdn.net/wgw335363240/article/details/6359614

java 枚舉類型enum 的使用

最近跟同事討論問題的時候,突然同事提到我們為什麼java 中定義的常量值不採用enmu 枚舉類型,而採用public final static 類型來定義呢?以前我們都是採用這種方式定義的,很少採用enum 定義,所以也都沒有注意過,面對突入起來的問題,還真有點不太清楚為什麼有這樣的定義。既然不明白就抽時間研究下吧。

Java 中的枚舉類型採用關鍵字enum 來定義,從jdk1.5才有的新類型,所有的枚舉類型都是繼承自Enum 類型。要瞭解枚舉類型,建議大家先開啟jdk 中的Enum 類簡單讀一下,這個類裡面定義了很多protected 方法,比如建構函式,如果要使用這些方法我們可以把枚舉類型定義到當前類中。每個枚舉類型,都有自己的名字和順序,當我們輸出一個枚舉類型的時候,會輸入枚舉類型的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;

}

 

 

二、   枚舉類型定義常量方法

枚舉類型的簡單定義方法如下,我們似乎沒辦法定義每個枚舉類型的值。比如我們定義紅燈、綠燈和黃燈的代碼可能如下:

 

public enum Light {

       RED GREEN YELLOW ;

}

 

我們只能夠表示出紅燈、綠燈和黃燈,但是具體的值我們沒辦法表示出來。別急,既然枚舉類型提供了建構函式,我們可以通過建構函式和覆寫toString 方法來實現。首先給Light 枚舉類型增加構造方法,然後每個枚舉類型的值通過建構函式傳入對應的參數,同時覆寫toString 方法,在該方法中返回從建構函式中傳入的參數,改造後的代碼如下:

 

public enum Light {

       // 利用建構函式傳參

       RED (1), GREEN (3), YELLOW (2);

 

       // 定義私人變數

       private int nCode ;

 

       // 建構函式,枚舉類型只能為私人

       private Light( int _nCode) {

           this . nCode = _nCode;

       }

 

       @Override

       public String toString() {

           return String.valueOf ( this . nCode );

       }

    }

 

 

三、   完整範例程式碼

枚舉類型的完整示範代碼如下:

 

package com.csdn.myEnum;

 

import java.util.EnumMap;

import java.util.EnumSet;

 

public class LightTest {

 

    // 1. 定義枚舉類型

    public enum Light {

       // 利用建構函式傳參

       RED (1), GREEN (3), YELLOW (2);

 

       // 定義私人變數

       private int nCode ;

 

       // 建構函式,枚舉類型只能為私人

       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. 遍曆枚舉類型

       System. out .println( " 示範枚舉類型的遍曆 ......" );

       testTraversalEnum ();

 

       // 2. 示範 EnumMap 對象的使用

       System. out .println( " 示範 EnmuMap 對象的使用和遍曆 ....." );

       testEnumMap ();

 

       // 3. 示範 EnmuSet 的使用

       System. out .println( " 示範 EnmuSet 對象的使用和遍曆 ....." );

       testEnumSet ();

    }

 

    /**

      * 示範枚舉類型的遍曆

      */

    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 的使用差不多,只不過 key 要是枚舉類型

      */

    private static void testEnumMap() {

       // 1. 示範定義 EnumMap 對象, EnumMap 對象的建構函式需要參數傳入 , 預設是key 的類的類型

       EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(

              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 是一個抽象類別,擷取一個類型的枚舉類型內容<BR/>

      * 可以使用 allOf 方法

      */

    private static void testEnumSet() {

       EnumSet<Light> currEnumSet = EnumSet.allOf (Light. class );

       for (Light aLightSetElement : currEnumSet) {

           System. out .println( " 當前 EnumSet 中資料為: " + aLightSetElement);

       }

 

    }

}

 

 

 

執行結果如下:

 

示範枚舉類型的遍曆 ......

當前燈 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

 

 

 

四、   通常定義常量方法和枚舉定義常量方法區別

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

1.    代碼:

public class State {

public static final int ON = 1;

public static final Int OFF= 0;

}

 

有什麼不好了,大家都這樣用了很長時間了,沒什麼問題啊。

首先,它不是型別安全的。你必須確保是int

其次,你還要確保它的範圍是0 和1

最後,很多時候你列印出來的時候,你只看到 1 和0 ,

 

但其沒有看到代碼的人並不知道你的企圖,拋棄你所有舊的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 多路分發

【轉】java枚舉類型enum的使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.