技術(shù)員聯(lián)盟提供win764位系統(tǒng)下載,win10,win7,xp,裝機(jī)純凈版,64位旗艦版,綠色軟件,免費(fèi)軟件下載基地!

當(dāng)前位置:主頁(yè) > 教程 > 服務(wù)器類(lèi) >

Java枚舉類(lèi)型enum的詳解及使用

來(lái)源:技術(shù)員聯(lián)盟┆發(fā)布時(shí)間:2017-10-13 06:30┆點(diǎn)擊:

Java枚舉類(lèi)型enum的詳解及使用

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

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

 二、   枚舉類(lèi)型定義常量方法

枚舉類(lèi)型的簡(jiǎn)單定義方法如下,我們似乎沒(méi)辦法定義每個(gè)枚舉類(lèi)型的值。比如我們定義紅燈、綠燈和黃燈的代碼可能如下:

public enum Light { RED , GREEN , YELLOW ; }

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

public enum Light { // 利用構(gòu)造函數(shù)傳參 RED (1), GREEN (3), YELLOW (2); // 定義私有變量 private int nCode ; // 構(gòu)造函數(shù),枚舉類(lèi)型只能為私有 private Light( int _nCode) { this . nCode = _nCode; } @Override public String toString() { return String.valueOf ( this . nCode ); } }

三、   完整示例代碼

枚舉類(lèi)型的完整演示代碼如下:

package com.csdn.myEnum; import java.util.EnumMap; import java.util.EnumSet; public class LightTest { // 1. 定義枚舉類(lèi)型 public enum Light { // 利用構(gòu)造函數(shù)傳參 RED (1), GREEN (3), YELLOW (2); // 定義私有變量 private int nCode ; // 構(gòu)造函數(shù),枚舉類(lèi)型只能為私有 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. 遍歷枚舉類(lèi)型 System. out .println( " 演示枚舉類(lèi)型的遍歷 ......" ); testTraversalEnum (); // 2. 演示 EnumMap 對(duì)象的使用 System. out .println( " 演示 EnmuMap 對(duì)象的使用和遍歷 ....." ); testEnumMap (); // 3. 演示 EnmuSet 的使用 System. out .println( " 演示 EnmuSet 對(duì)象的使用和遍歷 ....." ); testEnumSet (); } /** * 演示枚舉類(lèi)型的遍歷 */ 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 的使用差不多,只不過(guò) key 要是枚舉類(lèi)型 */ private static void testEnumMap() { // 1. 演示定義 EnumMap 對(duì)象, EnumMap 對(duì)象的構(gòu)造函數(shù)需要參數(shù)傳入 , 默認(rèn)是key 的類(lèi)的類(lèi)型 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è)抽象類(lèi),獲取一個(gè)類(lèi)型的枚舉類(lèi)型內(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); } } }

執(zhí)行結(jié)果如下:

演示枚舉類(lèi)型的遍歷 ...... 當(dāng)前燈 name : RED 當(dāng)前燈 ordinal : 0 當(dāng)前燈: 1 當(dāng)前燈 name : GREEN 當(dāng)前燈 ordinal : 1 當(dāng)前燈: 3 當(dāng)前燈 name : YELLOW 當(dāng)前燈 ordinal : 2 當(dāng)前燈: 2 演示 EnmuMap 對(duì)象的使用和遍歷 ..... [key=RED,value= 紅燈 ] [key=GREEN,value= 綠燈 ] [key=YELLOW,value= 黃燈 ] 演示 EnmuSet 對(duì)象的使用和遍歷 ..... 當(dāng)前 EnumSet 中數(shù)據(jù)為: 1 當(dāng)前 EnumSet 中數(shù)據(jù)為: 3 當(dāng)前 EnumSet 中數(shù)據(jù)為: 2

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

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

1.    代碼:

public class State { public static final int ON = 1; public static final Int OFF= 0; }

有什么不好了,大家都這樣用了很長(zhǎng)時(shí)間了,沒(méi)什么問(wèn)題啊。

首先,它不是類(lèi)型安全的。你必須確保是int

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

最后,很多時(shí)候你打印出來(lái)的時(shí)候,你只看到 1 和0 , 

但其沒(méi)有看到代碼的人并不知道你的企圖,拋棄你所有舊的public static final 常量吧