Java枚舉類型小結

Java枚舉類型小結

Java5 中引入了一個新的關鍵字——enum。我們可以利用enum來創建枚舉。Java中的枚舉也是一種類。它可以有自己的成員變量、方法,也可以實現接口、定義自己的構造器。同其他類一樣,每個Java原文件中只能定義一個public訪問權限的枚舉類,且此public枚舉類名需和Java源文件名相同。

枚舉類和其他類的不同點

  • 不能顯示繼承其他父類
    • enum定義的枚舉類默認繼承了java.lang.Enum類,由於Java不支持多重繼承,因此不可顯式繼承它者。
  • 默認實現了Serilizable和Comparable接口
  • 默認會被final修飾,無法派生子類
    • 注意:如果枚舉類中含有抽象方法,則它就會被修飾爲abstract而非final了
  • 構造器必須爲private
    • 缺省狀態下爲private
    • 如果顯式執行,也只能指定爲private
      • 這也是爲何枚舉類型變量無法在外部new出來,而只能引用已有者的緣故
  • 所有實例必須在第一行顯示列出,否則它將永遠無法產生實例
  • 實例會被自動修飾爲”public static final”

枚舉類的定義

private enum Gender{
    MALE,FEMALE;
}

可爲其添加成員變量:

private enum Gender{
    MALE,FEMALE;
    public String name;
}

可爲其添加方法。如本例,可添加一個setter && getter 以增強封裝性:

private enum Gender {
    MALE, FEMALE;
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (this == MALE && name.equals("man")
                || this == FEMALE && name.equals("woman")) {
            this.name = name;
        } else {
            System.out.println("parms ERROR");
        }
    }
}

可爲其添加構造器。如本例,可利用構造器增加枚舉類的不可變性:

private enum Gender{
    MALE("man"), FEMALE("female");
    private final String name;
    Gender(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
}

可讓其實現接口。

public class Main {

    private interface ShowInfo{
        void showInfo();
    }

    private enum Gender implements ShowInfo {
        MALE("man"), FEMALE("female");
        private final String name;

        Gender(String name) {
            this.name = name;
        }

        public String getName() {
            return this.name;
        }

        @Override
        public void showInfo() {
            System.out.println("This is enum Gender");
        }

    }

    public static void main(String[] args) {
        Gender.MALE.showInfo();
        Gender.FEMALE.showInfo();
    }

}

讀者會發現,這樣實現接口的話,執行結果是與實例無關的。如果我們想讓不同實例表現出不同結果,那麼可以這樣實現此接口:

private enum Gender implements ShowInfo {
    MALE("man") {
        @Override
        public void showInfo() {
            System.out.println("This is MALE");
        }
    },
    FEMALE("female") {
        @Override
        public void showInfo() {
            System.out.println("This is FEMALE");
        }
    };

    private final String name;

    Gender(String name) {
        this.name = name;
    }
}

我們可將其與匿名內部類的語法格式相比較,實例後的花括號就是類體,MALE&&FEMALE實例就是Gender子類的實例,在此類體中實現接口就可以將接口的行爲同實例關聯起來。編譯上面代碼將生成Gender.class、Gender1.classGender 2.class三個文件,這也印證了上面的結論。

還可爲枚舉類添加抽象方法:

enum CONST {
    A {
        @Override
        public void showName() {
            System.out.println("This is A");
        }
    },
    B {
        @Override
        public void showName() {
            System.out.println("This is B");
        }
    };

    public abstract void showName();
}

A和B依舊爲CONST類的子類。由於含有抽象方法,因此此枚舉類不再修飾爲final,而是直接修飾爲abstract,因此可以派生子類。

枚舉的使用

判別

枚舉類的元素常常用於表示一種符號,一種常量。那麼最常見的使用就是對其進行判斷了。樣例如下:

public class Main {

    private enum Gender {
        MALE, FEMALE;
    }

    public static void main(String[] args) {
        // 枚舉變量是不能被new出來,只能引用枚舉集合中存在的元素
        Gender myGender = Gender.FEMALE;
        if (myGender.equals(Gender.MALE)) { // 判別直接用 == 也可
            System.out.println("MAN");
        }
        else {
            System.out.println("FEMALE");
        }
    }
}

當然,除了if外,還可以用switch,尤其是在枚舉元素較多的情況下適用。

遍歷

枚舉類自帶有values()方法,可以用於元素的遍歷

public class Main {

    private enum Gender {
        MALE, FEMALE;
    }

    public static void main(String[] args) {
        for(Gender elem : Gender.values()){
            System.out.println(elem);
        }
    }
}

這個values方法實際上返回的是個數組,因此有關數組的使用(比如用length來獲取元素個數),對本方法也是有效的。

獲取元素索引

利用自帶的ordinal()方法即可返回某元素於枚舉集合中的位置(從0開始)

public class Main {

    private enum Gender {
        MALE, FEMALE;
    }

    public static void main(String[] args) {
        System.out.println(Gender.FEMALE.ordinal()); // 輸出:1
    }
}

利用已實現的Comparable接口

Enum把此接口實現爲用於判斷兩元素位置先後,看源碼不難發現,實際上返回的就是self.ordinal - other.ordinal。看個樣例:

public class Main {

    private enum ALPHABET {
        A, B, C, D, E;
    }

    public static void main(String[] args) {
        System.out.println(ALPHABET.A.compareTo(ALPHABET.B));//-1
        System.out.println(ALPHABET.B.compareTo(ALPHABET.B));//0
        System.out.println(ALPHABET.C.compareTo(ALPHABET.B));//1
    }
}

前者爲負,後者爲正,相同位置者爲零。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章