沒有枚舉之前:
在沒有枚舉之前,我們想列舉一些相關的常量,我們會採用如下的方式:
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的方法,這個方法返回枚舉值在枚舉類種的順序。