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; }
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表達式中直接寫入枚舉值,不需加入枚舉類做爲限定。
作一名快樂的程序媛!歡迎你們多提提寶貴建議!