java枚舉類型enum的使用

java 枚舉類型enum 的使用 java

最近跟同事討論問題的時候,忽然同事提到咱們爲何java 中定義的常量值不採用enmu 枚舉類型,而採用public final static  類型來定義呢?之前咱們都是採用這種方式定義的,不多采用enum 定義,因此也都沒有注意過,面對突入起來的問題,還真有點不太清楚爲何有這樣的定義。既然不明白就抽時間研究下吧。 程序員

Java 中的枚舉類型採用關鍵字enum 來定義,從jdk1.5纔有的新類型,全部的枚舉類型都是繼承自Enum 類型。要了解枚舉類型,建議你們先打開jdk 中的Enum 類簡單讀一下,這個類裏面定義了不少protected 方法,好比構造函數,若是要使用這些方法咱們能夠把枚舉類型定義到當前類中。每一個枚舉類型,都有本身的名字和順序,當咱們輸出一個枚舉類型的時候,會輸入枚舉類型的name ,具體能夠參考下面的例子。 設計模式

1、     一般定義常量方法 安全

咱們一般利用public final static 方法定義的代碼以下,分別用1 表示紅燈,3 表示綠燈,2 表示黃燈。 ide

package com.csdn.myEnum; 函數

public   class Light { this

      /* 紅燈 */ spa

      public   final   static   int   RED =1; 設計

      /* 綠燈 */ 對象

      public   final   static   int   GREEN =3;

      /* 黃燈 */

      public   final   static   int   YELLOW =2;

}

 

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 );

        }

     }

 

3、     完整示例代碼

枚舉類型的完整演示代碼以下:

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

 

 

4、     一般定義常量方法和枚舉定義常量方法區別

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

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

相關文章
相關標籤/搜索