Java5新特性之枚舉,java5新特性
1. 概念
首先,枚舉並不是一種新技術,而是一種基礎資料類型.它隸屬於兩種基礎類型中的值類型,如下:
2. 為什麼要有枚舉
枚舉在真正的開發中是非常常用的,它的作用很簡單也很純粹:它定義了一種規範,就是要讓某個類型的變數的取值只能為若干個固定值中的一個,也就是要符合它定義的規範.它可以讓編譯器在編譯時間就可以識別程式中填寫的非法值,一定程度上防止了運行時的非法類型值錯誤.
例如:要定義星期幾的變數,如果用普通變數1-7 分別表示星期一到星期日,但有人可能寫成int weekday=0.這種錯誤只能到運行時才能發現,編譯是沒問題的。但如果用枚舉代替普通變數,就可將錯誤在編譯時間識別。
枚舉本身當然是一個類,它的定義與使用與普通類很類似,而每個枚舉變數都相當於類的一個對象。下面將分別介紹枚舉的基本使用、帶有構造方法的枚舉、帶有抽象方法的枚舉。如下:
3. 基本使用
執行個體:
public class EnumTest2 {public static void main(String[] args) {WeekDay weekDay2 = WeekDay.FRI;//使用1:toString()方法System.out.println(weekDay2);//輸出:FRI//使用2:name()方法System.out.println(weekDay2.name());//輸出:FRI//使用3:ordinal()方法System.out.println(weekDay2.ordinal());//輸出:5//使用4:枚舉變數的反射System.out.println(WeekDay.valueOf("SUN").toString());//輸出:SUN//使用5:擷取枚舉的長度System.out.println(WeekDay.values().length);//輸出:7}/** * 定義枚舉類--這裡作為測試類別的一個子類 */public enum WeekDay{SUN,MON,TUE,WED,THI,FRI,SAT;}}
4. 帶有構造方法的枚舉
首先有兩點要求:
Ø 要求所有的東西都要在枚舉變數之後寫
Ø 構造方法必須是私人的
使用:
Ø 當使用某一個枚舉變數時,就會將所有的枚舉變數都執行個體化並緩衝;以後再次用到時不會再次執行個體化。
Ø 與普通類一樣,枚舉變數採用哪一個構造方法,也是根據參數的類型與個數而定。
執行個體:
public class EnumTest {public static void main(String[] args) {WeekDay weekDay = WeekDay.MON;System.out.println("-------------");WeekDay weekDay2 = WeekDay.TUE;/* * 輸出結果如下: 構造方法3構造方法2構造方法1構造方法1構造方法1構造方法1構造方法1-------------(結束) * 上面調用MON時,所有的枚舉變數的構造方法都被調用;再次調用TUE時沒有再調用 * 表明,當使用某一個枚舉變數時,就會將所有的枚舉變數都執行個體化並緩衝; * 以後再次用到時不會再次執行個體化 */}/** * 定義枚舉類--這裡作為測試類別的一個子類 */public enum WeekDay{//與普通類一樣,枚舉變數採用哪一個構造方法,也是根據參數的類型與個數而定//如下SUN將採用構造方法3;MON採用構造方法2;其餘的都採用構造方法1SUN(1,2),MON(1),TUE(),WED,THI,FRI,SAT;//構造方法1:private WeekDay(){System.out.println("構造方法1");}//構造方法2private WeekDay(int day){System.out.println("構造方法2");}//構造方法3private WeekDay(int day,int day2){System.out.println("構造方法3");}}
5. 帶有抽象方法的枚舉
枚舉類中的邏輯方法,肯定會涉及到所有的枚舉變數,要進行邏輯判斷就必須要使用大量的if…else語句。而使用抽象方法就可以將if…else語句轉移成一個個獨立的類。
如,下面的交通燈枚舉類中,若要計算下一個燈的顏色,普通的寫法肯定要判斷,如果當前“紅燈”那麼下一個燈為“綠燈”;如果當前為“綠燈”那麼下一個燈為“黃燈”……;而如果使用抽象方法則可將一系列判斷轉移為一個個獨立的類。執行個體:
/** * 定義枚舉類 */public enum TrafficLamp{//"{}"表示一個匿名子類,所以就可以重寫枚舉的抽象方法。這裡將if..else轉化為了3個匿名子類RED(30){public TrafficLamp nextLamp(){return GREEN;}},GREEN(45){public TrafficLamp nextLamp(){return YELLOW;}},YELLOW(5){public TrafficLamp nextLamp(){return RED;}};//抽象方法-計算下一個燈的顏色public abstract TrafficLamp nextLamp();private int time;//定義交通燈的期間private TrafficLamp(int time){this.time = time;}//構造方法}
6. 普通類類比枚舉類
下面簡單用普通類來類比一下枚舉類
要素:
Ø 私人的構造方法
Ø 用一個個公有的靜態成員變數類比枚舉變數
Ø 可以有若干公有方法或
執行個體:
package TestPage;public abstract class WeekDay {//私人的構造方法private WeekDay(){}//公有的靜態成員變數SUN、MON類比枚舉變數,"{}"表示一個匿名子類public final static WeekDay SUN = new WeekDay(){@Overridepublic WeekDay nextDay() {return MON;}};public final static WeekDay MON = new WeekDay(){@Overridepublic WeekDay nextDay() {return SUN;}};// 抽象方法-轉移計算nextDay的邏輯public abstract WeekDay nextDay();//普通的計算nextDay的方法,要用if...else判斷/*public WeekDay nextDay(){if(this == SUN){return MON;}else{return SUN;}}*///公有方法public String toString(){return this==SUN?"SUN":"MON";}}
7. 總結
枚舉是一個較特殊的“類”,枚舉變數相當於枚舉類的一個個對象。它定義一種規範,讓枚舉變數的取值必須符合它定義的規範,只能為若干個固定值中的一個,從而在一定程度上防止了運行時的非法類型值錯誤.
java50 新特性
挖 學JAVA的 你有QQ嗎 幫我改幾個軟體吧 0 0~ HOHO~\
這個問題不應該在這問
java5中的枚舉與字串數組的不同?
隨著電腦的不斷普及,程式不僅只用於數值計算,還更廣泛地用於處理非數值的資料。例如:性別、月份、星期幾、顏色、單位名、學曆、職業等,都不是數值資料。在其它程式設計語言中,一般用一個數值來代表某一狀態,這種處理方法不直觀,易讀性差。如果能在程式中用自然語言中有相應含義的單詞來代表某一狀態,則程式就很容易閱讀和理解。也就是說,事先考慮到某一變數可能取的值,盡量用自然語言中含義清楚的單詞來表示它的每一個值,這種方法稱為枚舉方法,用這種方法定義的類型稱枚舉類型