【JAVA】淺談java枚舉類

1、什麼狀況下使用枚舉類?java

  有的時候一個類的對象是有限且固定的,這種狀況下咱們使用枚舉類就比較方便?安全

2、爲何不用靜態常量來替代枚舉類呢?ide

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;

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

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

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

3、枚舉類入門繼承

  先看一個簡單的枚舉類。接口

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. 枚舉類的構造器只能是私有的。

4、枚舉類介紹開發

  枚舉類內也能夠定義屬性和方法,但是是靜態的和非靜態的。get

package enumcase;

public enum SeasonEnum {
    SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");
    
    private final String name;
    
    private SeasonEnum(String name)
    {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

    實際上在第一行寫枚舉類實例的時候,默認是調用了構造器的,因此此處須要傳入參數,由於沒有顯式申明無參構造器,只能調用有參數的構造器。

  構造器需定義成私有的,這樣就不能在別處申明此類的對象了。枚舉類一般應該設計成不可變類,它的Field不該該被改變,這樣會更安全,並且代碼更加簡潔。因此咱們將Field用private final修飾。

5、枚舉類實現接口

  枚舉類能夠實現一個或多個接口。與普通類同樣,實現接口的時候須要實現接口中定義的全部方法,若沒有徹底實現,那這個枚舉類就是抽象的,只是不需顯式加上abstract修飾,系統化會默認加上。

package enumcase;

public enum Operation {
    PLUS{

        @Override
        public double eval(double x, double y) {
            return x + y;
        }
        
    },
    MINUS{

        @Override
        public double eval(double x, double y) {
            return x - y;
        }
        
    },
    TIMES{

        @Override
        public double eval(double x, double y) {
            return x * y;
        }
        
    },
    DIVIDE{

        @Override
        public double eval(double x, double y) {
            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類其實是抽象的,不能夠建立枚舉值,因此此處在申明枚舉值的時候,都實現了抽象方法,這實際上是匿名內部類的實現,花括號部分是一個類體。咱們能夠看下編譯之後的文件。

  

  共生成了五個class文件,這樣就證實了PLUS,MINUS,TIMES,DIVIDE是Operation的匿名內部類的實例。

6、switch語句裏的表達式能夠是枚舉值

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

package enumcase;

public class SeasonTest {
    public void judge(SeasonEnum s)
    {
        switch(s)
        {
        case SPRING:
            System.out.println("春天適合踏青。");
            break;
        case SUMMER:
            System.out.println("夏天要去游泳啦。");
            break;
        case FALL:
            System.out.println("秋天必定要去旅遊哦。");
            break;
        case WINTER:
            System.out.println("冬天要是下雪就好啦。");
            break;
        }
    }
    
    public static void main(String[] args) {
        SeasonEnum s = SeasonEnum.SPRING;
        SeasonTest test = new SeasonTest();
        test.judge(s);
    }
}

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

作一名快樂的程序媛!歡迎你們多提提寶貴建議!

相關文章
相關標籤/搜索