java 枚举类型enum
?
簡單介紹
Java?中的枚舉類型采用關鍵字enum?來定義,從jdk1.5才有的新類型,所有的枚舉類型都是繼承自Enum?類型。要了解枚舉類型,建議大家先打開jdk?中的Enum?類簡單讀一下,這個類里面定義了很多protected?方法,比如構造函數,如果要使用這些方法我們可以把枚舉類型定義到當前類中。每個枚舉類型,都有自己的名字和順序,當我們輸出一個枚舉類型的時候,會輸入枚舉類型的name?,具體可以參考下面的例子。
一、???通常定義常量方法
我們通常利用public final static?方法定義的代碼如下,分別用1?表示紅燈,3?表示綠燈,2?表示黃燈。
package com.wbg; public class Light {/* 紅燈 */public final static int RED =1;/* 綠燈 */public final static int GREEN =3;/* 黃燈 */public final static int YELLOW =2; }二、???枚舉類型定義常量方法
枚舉類型提供了構造函數,我們可以通過構造函數和覆寫toString?方法來實現。首先給Light?枚舉類型增加構造方法,然后每個枚舉類型的值通過構造函數傳入對應的參數,同時覆寫toString?方法,在該方法中返回從構造函數中傳入的參數,代碼如下:
public enum Light {// 利用構造函數傳參RED (1), GREEN (3), YELLOW (2);// 定義私有變量private int nCode ;// 構造函數,枚舉類型只能為私有private Light( int nCode) {this . nCode = nCode;}@Overridepublic String toString() {return String.valueOf ( this.nCode );}}三、???完整示例代碼
枚舉類型的完整演示代碼如下:
package com.wbg;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;}@Overridepublic 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);}} } View Code執行結果如下:
四、???通常定義常量方法和枚舉定義常量方法區別
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?多路分發
?
轉載于:https://www.cnblogs.com/weibanggang/p/9477417.html
總結
以上是生活随笔為你收集整理的java 枚举类型enum的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【笔试题】简单的两道笔试题(1、打印杨辉
- 下一篇: 面试--二分查找