Java5新特性之枚舉,java5新特性

來源:互聯網
上載者:User

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中的枚舉與字串數組的不同?

隨著電腦的不斷普及,程式不僅只用於數值計算,還更廣泛地用於處理非數值的資料。例如:性別、月份、星期幾、顏色、單位名、學曆、職業等,都不是數值資料。在其它程式設計語言中,一般用一個數值來代表某一狀態,這種處理方法不直觀,易讀性差。如果能在程式中用自然語言中有相應含義的單詞來代表某一狀態,則程式就很容易閱讀和理解。也就是說,事先考慮到某一變數可能取的值,盡量用自然語言中含義清楚的單詞來表示它的每一個值,這種方法稱為枚舉方法,用這種方法定義的類型稱枚舉類型
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.