最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java枚舉類型enum的詳解及使用

 更新時間:2017年05月22日 08:41:10   投稿:lqh  
這篇文章主要介紹了Java枚舉類型enum的詳解及使用的相關資料,需要的朋友可以參考下

 Java枚舉類型enum的詳解及使用

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

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

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

public enum Light {
    // 利用構造函數(shù)傳參
    RED (1), GREEN (3), YELLOW (2);
 
    // 定義私有變量
    private int nCode ;
 
    // 構造函數(shù),枚舉類型只能為私有
    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 {
    // 利用構造函數(shù)傳參
    RED (1), GREEN (3), YELLOW (2);
 
    // 定義私有變量
    private int nCode ;
 
    // 構造函數(shù),枚舉類型只能為私有
    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 對象的構造函數(shù)需要參數(shù)傳入 , 默認是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 是一個抽象類,獲取一個類型的枚舉類型內(nèi)容<BR/>
   * 可以使用 allOf 方法
   */
  private static void testEnumSet() {
    EnumSet<Light> currEnumSet = EnumSet.allOf (Light. class );
    for (Light aLightSetElement : currEnumSet) {
      System. out .println( " 當前 EnumSet 中數(shù)據(jù)為: " + aLightSetElement);
    }
 
  }
}
 
 

執(zhí)行結果如下:

演示枚舉類型的遍歷 ......
當前燈 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 中數(shù)據(jù)為: 1
當前 EnumSet 中數(shù)據(jù)為: 3
當前 EnumSet 中數(shù)據(jù)為: 2
 

 四、   通常定義常量方法和枚舉定義常量方法區(qū)別

以下內(nèi)容可能有些無聊,但絕對值得一窺

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.    可以創(chuàng)建一個enum 類,把它看做一個普通的類。除了它不能繼承其他類了。(java 是單繼承,它已經(jīng)繼承了Enum),
可以添加其他方法,覆蓋它本身的方法

3.    switch() 參數(shù)可以使用enum 了 

4.    values() 方法是編譯器插入到enum 定義中的static 方法,所以,當你將enum 實例向上轉(zhuǎn)型為父類Enum是,values() 就不可訪問了。解決辦法:在Class 中有一個getEnumConstants() 方法,所以即便Enum 接口中沒有values() 方法,我們?nèi)匀豢梢酝ㄟ^Class 對象取得所有的enum 實例 

5.    無法從enum 繼承子類,如果需要擴展enum 中的元素,在一個接口的內(nèi)部,創(chuàng)建實現(xiàn)該接口的枚舉,以此將元素進行分組。達到將枚舉元素進行分組。 

6.    使用EnumSet 代替標志。enum 要求其成員都是唯一的,但是enum 中不能刪除添加元素。 

7.    EnumMap 的key 是enum ,value 是任何其他Object 對象。 

8.    enum 允許程序員為eunm 實例編寫方法。所以可以為每個enum 實例賦予各自不同的行為。 

9.    使用enum 的職責鏈(Chain of Responsibility) . 這個關系到設計模式的職責鏈模式。以多種不同的方法來解決一個問題。然后將他們鏈接在一起。當一個請求到來時,遍歷這個鏈,直到鏈中的某個解決方案能夠處理該請求。 

10.   使用enum 的狀態(tài)機 

11.   使用enum 多路分發(fā)

 感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • javax.validation自定義日期范圍校驗注解操作

    javax.validation自定義日期范圍校驗注解操作

    這篇文章主要介紹了javax.validation自定義日期范圍校驗注解操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java pdu短信解碼全面解析

    Java pdu短信解碼全面解析

    本文是根據(jù)python的方法改寫的pdu短信解碼,非常不錯,代碼簡單易懂具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-10-10
  • Java中樹的存儲結構實現(xiàn)示例代碼

    Java中樹的存儲結構實現(xiàn)示例代碼

    本篇文章主要介紹了Java中樹的存儲結構實現(xiàn)示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • java 多線程-鎖詳解及示例代碼

    java 多線程-鎖詳解及示例代碼

    本文主要介紹 Java 多線程鎖的基礎知識,這里整理了相關資料及示例代碼有興趣的小伙伴可以參考下
    2016-09-09
  • springboot+RabbitMQ+InfluxDB+Grafara監(jiān)控實踐

    springboot+RabbitMQ+InfluxDB+Grafara監(jiān)控實踐

    這篇文章主要介紹了springboot+RabbitMQ+InfluxDB+Grafara監(jiān)控實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • spring循環(huán)依賴策略解析

    spring循環(huán)依賴策略解析

    這篇文章主要為大家詳細介紹了spring循環(huán)依賴策略,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • SPRING BOOT啟動命令參數(shù)及源碼詳析

    SPRING BOOT啟動命令參數(shù)及源碼詳析

    這篇文章主要給大家介紹了關于SPRING BOOT啟動命令參數(shù)及源碼分析的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用SPRING BOOT具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-12-12
  • java網(wǎng)絡編程中向指定URL發(fā)送GET POST請求示例

    java網(wǎng)絡編程中向指定URL發(fā)送GET POST請求示例

    這篇文章主要介紹了java向指定URL發(fā)送GET POST請求示例,學習JAVA網(wǎng)絡編程一定會用到的,大家參考使用吧
    2013-11-11
  • 一文搞懂JMeter engine中HashTree的配置問題

    一文搞懂JMeter engine中HashTree的配置問題

    本文主要介紹了JMeter engine中HashTree的配置,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 在 Spring Boot 3 中接入生成式 AI的操作方法

    在 Spring Boot 3 中接入生成式 AI的操作方法

    本文介紹了如何在SpringBoot3中集成生成式AI,以OpenAI的GPT模型為例,通過代碼示例展示了如何實現(xiàn),SpringBoot3的優(yōu)勢和OpenAI的生成式AI技術結合,為開發(fā)者提供了高效集成生成式AI的方法,感興趣的朋友跟隨小編一起看看吧
    2025-01-01

最新評論

镇宁| 顺义区| 海晏县| 忻州市| 万宁市| 贵州省| 宜良县| 自贡市| 宜章县| 北碚区| 五寨县| 孟州市| 睢宁县| 固始县| 宁国市| 浦东新区| 庆阳市| 宾川县| 庆元县| 东阳市| 马龙县| 土默特右旗| 永康市| 石景山区| 佛学| 田东县| 古丈县| 池州市| 乐业县| 娱乐| 且末县| 子洲县| 沭阳县| 清新县| 石阡县| 大同县| 漳州市| 文山县| 高青县| 定安县| 日照市|