天天看點

淺談java枚舉類

一、什麼情況下使用枚舉類?

  有的時候一個類的對象是有限且固定的,這種情況下我們使用枚舉類就比較友善?

二、為什麼不用靜态常量來替代枚舉類呢?

public static final int SEASON_SPRING = 1;

    public static final int SEASON_SUMMER = 2;

    public static final int SEASON_FALL = 3;

    public static final int SEASON_WINTER = 4;

  枚舉類更加直覺,類型安全。使用常量會有以下幾個缺陷:

  1. 類型不安全。若一個方法中要求傳入季節這個參數,用常量的話,形參就是int類型,開發者傳入任意類型的int類型值就行,但是如果是枚舉類型的話,就隻能傳入枚舉類中包含的對象。

  2. 沒有命名空間。開發者要在命名的時候以SEASON_開頭,這樣另外一個開發者再看這段代碼的時候,才知道這四個常量分别代表季節。

三、枚舉類入門

  先看一個簡單的枚舉類。

package enumcase;

public enum SeasonEnum {

    SPRING,SUMMER,FALL,WINTER;

}

  1. enum和class、interface的地位一樣
  2. 使用enum定義的枚舉類預設繼承了java.lang.Enum,而不是繼承Object類。枚舉類可以實作一個或多個接口。
  3. 枚舉類的所有執行個體都必須放在第一行展示,不需使用new 關鍵字,不需顯式調用構造器。自動添加public static final修飾。
  4. 使用enum定義、非抽象的枚舉類預設使用final修飾,不可以被繼承。
  5. 枚舉類的構造器隻能是私有的。

四、枚舉類介紹

  枚舉類内也可以定義屬性和方法,可是是靜态的和非靜态的。

    SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");

    private final String name;

    private SeasonEnum(String name)

    {

        this.name = name;

    }

    public String getName() {

        return name;

    實際上在第一行寫枚舉類執行個體的時候,預設是調用了構造器的,是以此處需要傳入參數,因為沒有顯式申明無參構造器,隻能調用有參數的構造器。

  構造器需定義成私有的,這樣就不能在别處申明此類的對象了。枚舉類通常應該設計成不可變類,它的Field不應該被改變,這樣會更安全,而且代碼更加簡潔。是以我們将Field用private final修飾。

五、枚舉類實作接口

  枚舉類可以實作一個或多個接口。與普通類一樣,實作接口的時候需要實作接口中定義的所有方法,若沒有完全實作,那這個枚舉類就是抽象的,隻是不需顯式加上abstract修飾,系統化會預設加上。

public enum Operation {

    PLUS{

        @Override

        public double eval(double x, double y) {

            return x + y;

        }

    },

    MINUS{

            return x - y;

    TIMES{

            return x * y;

    DIVIDE{

            return x / y;

    };

    /**

     * 抽象方法,由不同的枚舉值提供不同的實作。

     * @param x

     * @param y

     * @return

     */

    public abstract double eval(double x, double y);

    public static void main(String[] args) {

        System.out.println(Operation.PLUS.eval(10, 2));

        System.out.println(Operation.MINUS.eval(10, 2));

        System.out.println(Operation.TIMES.eval(10, 2));

        System.out.println(Operation.DIVIDE.eval(10, 2));

  Operatio類實際上是抽象的,不可以建立枚舉值,是以此處在申明枚舉值的時候,都實作了抽象方法,這其實是匿名内部類的實作,花括号部分是一個類體。我們可以看下編譯以後的檔案。

  

淺談java枚舉類

  共生成了五個class檔案,這樣就證明了PLUS,MINUS,TIMES,DIVIDE是Operation的匿名内部類的執行個體。

六、switch語句裡的表達式可以是枚舉值

  Java5新增了enum關鍵字,同時擴充了switch。

public class SeasonTest {

    public void judge(SeasonEnum s)

        switch(s)

        {

        case SPRING:

            System.out.println("春天适合踏青。");

            break;

        case SUMMER:

            System.out.println("夏天要去遊泳啦。");

        case FALL:

            System.out.println("秋天一定要去旅遊哦。");

        case WINTER:

            System.out.println("冬天要是下雪就好啦。");

        SeasonEnum s = SeasonEnum.SPRING;

        SeasonTest test = new SeasonTest();

        test.judge(s);

  case表達式中直接寫入枚舉值,不需加入枚舉類作為限定。