java 枚举类型enum
?
簡單介紹
Java?中的枚舉類型采用關(guān)鍵字enum?來定義,從jdk1.5才有的新類型,所有的枚舉類型都是繼承自Enum?類型。要了解枚舉類型,建議大家先打開jdk?中的Enum?類簡單讀一下,這個(gè)類里面定義了很多protected?方法,比如構(gòu)造函數(shù),如果要使用這些方法我們可以把枚舉類型定義到當(dāng)前類中。每個(gè)枚舉類型,都有自己的名字和順序,當(dāng)我們輸出一個(gè)枚舉類型的時(shí)候,會(huì)輸入枚舉類型的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; }二、???枚舉類型定義常量方法
枚舉類型提供了構(gòu)造函數(shù),我們可以通過構(gòu)造函數(shù)和覆寫toString?方法來實(shí)現(xiàn)。首先給Light?枚舉類型增加構(gòu)造方法,然后每個(gè)枚舉類型的值通過構(gòu)造函數(shù)傳入對(duì)應(yīng)的參數(shù),同時(shí)覆寫toString?方法,在該方法中返回從構(gòu)造函數(shù)中傳入的參數(shù),代碼如下:
public enum Light {// 利用構(gòu)造函數(shù)傳參RED (1), GREEN (3), YELLOW (2);// 定義私有變量private int nCode ;// 構(gòu)造函數(shù),枚舉類型只能為私有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 {// 利用構(gòu)造函數(shù)傳參RED (1), GREEN (3), YELLOW (2);// 定義私有變量private int nCode ;// 構(gòu)造函數(shù),枚舉類型只能為私有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 對(duì)象的使用System. out .println( " 演示 EnmuMap 對(duì)象的使用和遍歷 ....." );testEnumMap ();// 3. 演示 EnmuSet 的使用System. out .println( " 演示 EnmuSet 對(duì)象的使用和遍歷 ....." );testEnumSet ();}/*** 演示枚舉類型的遍歷*/private static void testTraversalEnum() {Light[] allLight = Light.values ();for (Light aLight : allLight) {System. out .println( " 當(dāng)前燈 name : " + aLight.name());System. out .println( " 當(dāng)前燈 ordinal : " + aLight.ordinal());System. out .println( " 當(dāng)前燈: " + aLight);}}/*** 演示 EnumMap 的使用, EnumMap 跟 HashMap 的使用差不多,只不過 key 要是枚舉類型*/private static void testEnumMap() {// 1. 演示定義 EnumMap 對(duì)象, EnumMap 對(duì)象的構(gòu)造函數(shù)需要參數(shù)傳入 , 默認(rèn)是 key 的類的類型EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(Light. class );currEnumMap.put(Light. RED , " 紅燈 " );currEnumMap.put(Light. GREEN , " 綠燈 " );currEnumMap.put(Light. YELLOW , " 黃燈 " );// 2. 遍歷對(duì)象for (Light aLight : Light.values ()) {System. out .println( "[key=" + aLight.name() + ",value="+ currEnumMap.get(aLight) + "]" );}}/*** 演示 EnumSet 如何使用, EnumSet 是一個(gè)抽象類,獲取一個(gè)類型的枚舉類型內(nèi)容 <BR/>* 可以使用 allOf 方法*/private static void testEnumSet() {EnumSet<Light> currEnumSet = EnumSet.allOf (Light. class );for (Light aLightSetElement : currEnumSet) {System. out .println( " 當(dāng)前 EnumSet 中數(shù)據(jù)為: " + aLightSetElement);}} } View Code執(zhí)行結(jié)果如下:
四、???通常定義常量方法和枚舉定義常量方法區(qū)別
1.????代碼:
public class State {public static final int ON = 1;public static final int OFF= 0;}首先,它不是類型安全的。你必須確保是int
其次,你還要確保它的范圍是0?和1
最后,很多時(shí)候你打印出來的時(shí)候,你只看到?1?和0?,
但其沒有看到代碼的人并不知道你的企圖,拋棄你所有舊的public static final?常量吧
2.????可以創(chuàng)建一個(gè)enum?類,把它看做一個(gè)普通的類。除了它不能繼承其他類了。(java?是單繼承,它已經(jīng)繼承了Enum),可以添加其他方法,覆蓋它本身的方法
3.????switch()?參數(shù)可以使用enum?了
4.????values()?方法是編譯器插入到enum?定義中的static?方法,所以,當(dāng)你將enum?實(shí)例向上轉(zhuǎn)型為父類Enum?是,values()?就不可訪問了。解決辦法:在Class?中有一個(gè)getEnumConstants()?方法,所以即便Enum?接口中沒有values()?方法,我們?nèi)匀豢梢酝ㄟ^Class?對(duì)象取得所有的enum?實(shí)例
5.????無法從enum?繼承子類,如果需要擴(kuò)展enum?中的元素,在一個(gè)接口的內(nèi)部,創(chuàng)建實(shí)現(xiàn)該接口的枚舉,以此將元素進(jìn)行分組。達(dá)到將枚舉元素進(jìn)行分組。
6.????使用EnumSet?代替標(biāo)志。enum?要求其成員都是唯一的,但是enum?中不能刪除添加元素。
7.????EnumMap?的key?是enum?,value?是任何其他Object?對(duì)象。
8.????enum?允許程序員為eunm?實(shí)例編寫方法。所以可以為每個(gè)enum?實(shí)例賦予各自不同的行為。
9.????使用enum?的職責(zé)鏈(Chain of Responsibility) .?這個(gè)關(guān)系到設(shè)計(jì)模式的職責(zé)鏈模式。以多種不同的方法來解決一個(gè)問題。然后將他們鏈接在一起。當(dāng)一個(gè)請(qǐng)求到來時(shí),遍歷這個(gè)鏈,直到鏈中的某個(gè)解決方案能夠處理該請(qǐng)求。
10.???使用enum?的狀態(tài)機(jī)
11.???使用enum?多路分發(fā)
?
轉(zhuǎn)載于:https://www.cnblogs.com/weibanggang/p/9477417.html
總結(jié)
以上是生活随笔為你收集整理的java 枚举类型enum的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【笔试题】简单的两道笔试题(1、打印杨辉
- 下一篇: 面试--二分查找