再談java枚舉 ENUM

來源:互聯網
上載者:User

沒有枚舉之前:

  在沒有枚舉之前,我們想列舉一些相關的常量,我們會採用如下的方式:

interface ActionInterface {public static final int RIGHT = 0;public static final int LEFT = 1;}

  然後在某個類似於下面的方法中,使用這些常量:

public void playWithInterface(int num) {switch (num) {case ActionInterface.RIGHT:System.out.println("RIGHT");break;case ActionInterface.LEFT:System.out.println("LEFT");break;default:System.out.println("Default");}}

  不知道你注意了沒,在這樣做的時候,請記住這類常量是 Java 中 int 類型的常量,這意味著該方法可以接受任何 int 類型的值,即使它和之前的介面中定的所有常量都不對應。因此,您需要檢測上界和下界,在出現無效值的時候,你只能依賴switch中的default或者其他的處理手段,而且,如果後來又添加另外一個常量的時候,那麼你就必須改變很多相關聯代碼中的上界,下界處理常式,才能接受這個新值。

有了枚舉之後:

  你應該對於這種情況,總是使用枚舉,比如:

enum ActionEnum{RIGHT,LEFT}

  然後在某個類似於下面的方法中,使用它們:

public void playWithEnum(ActionEnum actionEnum) {switch (actionEnum) {case RIGHT:System.out.println("RIGHT");break;case LEFT:System.out.println("LEFT");break;default:System.out.println("Default");}}

  這樣,你就不必費很大的心思去檢查之前的一些問題,而且即便需求修改之後,添加了一些相關的變數,你只需要修改ActionEnum就行,其餘代碼都不需要修改。

  需要注意的是,在上面的switch中,我們使用的是case RIGHT... 而不是case ActionEnum.RIGHT(這樣會出錯),原因是枚舉重寫了ToString(),也就是說枚舉變數的值是不帶首碼的。

上面所說的,可能並不能完全顯示出枚舉類型的優勢,但是確實我們經常採用的形式。下面我們來儘可能的認識一下枚舉:

package com.java;public class EnumDemo {/** * 最簡單的枚舉樣本 * */public enum SimpleEnum {UP, DOWN}/** * 帶有屬性和方法的枚舉樣本 * 注意:枚舉本身也是類,可以象一般的類一樣為它添加靜態或者非靜態屬性或方法 *   但是枚舉列表必須寫在最前面,否則編譯出錯。比如本例中的UP,DOWN * */public enum EnumWithFuncAndAttr {UP, DOWN;private static final String description = "這個是一個有方法和屬性的枚舉樣本";public String getDescription() {return description;}}/** * 帶有建構函式的枚舉樣本 * 注意:枚舉可以有構造方法,通過括弧賦值。如果不賦值,那麼就不能編寫構造方法,否則出錯。 * 構造方法只能是private的或者預設的。而不能是public以及protected,否則出錯。這樣做可以保證客戶代碼沒有辦法建立一個enum的執行個體 * */public enum EnumWithConstructor{UP("hello"),DOWN("java");private final String value;String getValue(){return value;}EnumWithConstructor(String value){this.value=value;}}public static void main(String[] args) {System.out.println(SimpleEnum.values().length);System.out.println(SimpleEnum.UP);System.out.println(SimpleEnum.valueOf("UP"));for (EnumWithConstructor item : EnumWithConstructor.values()) {System.out.println(item+" "+item.getValue());}System.out.println(SimpleEnum.UP.ordinal());}}

  總結:

  1.枚舉本身就是一個類。

  2.它不能有public的建構函式,這樣做可以保證客戶代碼沒有辦法建立一個enum的執行個體。     

  3..所有枚舉值都是public static final的。注意這一點只是針對於枚舉值,我們可以和在普通類裡面定義變數一樣定義其它任何類型的非枚舉變數,這些變數可以用任何你想用的修飾符。     

  4.Enum預設實現了java.lang.Comparable介面。     

  5.Enum覆載了了toString方法,因此我們如果調用Color.Blue.toString()預設返回字串”Blue”.

  6.Enum提供了一個valueOf方法,這個方法和toString方法是相對應的。調用valueOf(“Blue”)將返回Color.Blue.因此我們在自己重寫toString方法的時候就要注意到這一點,一般來說應該相對應地重寫valueOf方法。     

   7.Enum還提供了values方法,這個方法使你能夠方便的遍曆所有的枚舉值

  8.Enum還有一個oridinal的方法,這個方法返回枚舉值在枚舉類種的順序。

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.