這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)在Java項(xiàng)目中使用枚舉類型的方法有哪些,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)公司專注于海州企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站建設(shè),商城網(wǎng)站制作。海州網(wǎng)站建設(shè)公司,為海州等地區(qū)提供建站服務(wù)。全流程按需求定制網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
Java枚舉類型enum
一、 通常定義常量方法
我們通常利用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; }
二、 枚舉類型定義常量方法
枚舉類型的簡(jiǎn)單定義方法如下,我們似乎沒辦法定義每個(gè)枚舉類型的值。比如我們定義紅燈、綠燈和黃燈的代碼可能如下:
public enum Light { RED , GREEN , YELLOW ; }
我們只能夠表示出紅燈、綠燈和黃燈,但是具體的值我們沒辦法表示出來。別急,既然枚舉類型提供了構(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; } @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 { // 利用構(gòu)造函數(shù)傳參 RED (1), GREEN (3), YELLOW (2); // 定義私有變量 private int nCode ; // 構(gòu)造函數(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 對(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 的類的類型 EnumMapcurrEnumMap = new EnumMap ( 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)容
* 可以使用 allOf 方法 */ private static void testEnumSet() { EnumSetcurrEnumSet = EnumSet.allOf (Light. class ); for (Light aLightSetElement : currEnumSet) { System. out .println( " 當(dāng)前 EnumSet 中數(shù)據(jù)為: " + aLightSetElement); } } }
執(zhí)行結(jié)果如下:
演示枚舉類型的遍歷 ...... 當(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)容可能有些無聊,但絕對(duì)值得一窺
1. 代碼:
public class State { public static final int ON = 1; public static final Int OFF= 0; }
有什么不好了,大家都這樣用了很長(zhǎng)時(shí)間了,沒什么問題啊。
首先,它不是類型安全的。你必須確保是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ā)
上述就是小編為大家分享的在Java項(xiàng)目中使用枚舉類型的方法有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。