一、什麼是Java Enum類
Java Enum類是從Java 5開始引入的類型,它是一種特殊類型的類,它可以用來定義一組常量,這些常量通常表示一些有限的可能性。Enum類可以被看作是一組有限常量的組合,同時它也可以具有屬性和方法,這些屬性和方法是與枚舉的常量相關聯的。
Enum類是final類,所以它不能被繼承。同時Enum類的構造方法是私有的,因此枚舉常量的實例化不能在程序中自行完成,而是由編譯器完成實例化。
二、Java Enum類的優缺點
Enum類具有以下優點:
1、易讀性好:枚舉類型常量名稱是有意義的,而且可以據此獲知它是整個類型中的哪一個。
2、類型安全:由於枚舉值是在編譯器進行檢查的,所以不存在誤解,也可以防止在傳遞參數時傳遞非法的枚舉值。
3、可讀性好:我們可以使用枚舉類型的toString()方法獲取具有可讀性的名稱。
4、可以使用switch語句:我們可以使用switch語句輕鬆處理枚舉類型。
Enum類具有以下缺點:
1、不能繼承:對於一些含有許多共同特徵的常量,可能會導致代碼重複,但是由於Enum類不能被繼承,所以不得不重複定義。
2、不能在運行時動態獲得枚舉值:由於枚舉值是在編譯器進行檢查的,所以不能通過簡單的字元串轉換獲得枚舉值,如果需要這樣做,需要手動編寫代碼進行轉換。
三、Java Enum類的定義和使用
1、定義枚舉類型
public enum Season { SPRING, SUMMER, AUTUMN, WINTER; }
在定義枚舉類型時,除了類名和枚舉常量之外,不需要添加其他元素。
上面的例子中定義了一個代表四季的枚舉類型Season,其中SPRING、SUMMER、AUTUMN和WINTER是四個枚舉常量,它們分別代表春、夏、秋、冬。
2、使用枚舉類型
Season season = Season.SUMMER;
我們可以通過枚舉類型名稱和枚舉常量名稱來獲得枚舉類型的實例,這裡的變數season就是Season類型的實例化對象。
3、枚舉類型的屬性和方法
除了可以使用枚舉類型的名稱和枚舉常量名稱來獲得枚舉類型的實例之外,我們還可以使用枚舉類型的屬性和方法來獲取相關信息。
3.1、獲取枚舉類型的屬性
public enum Season { SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天"); private String name; Season(String name) { this.name = name; } public String getName() { return name; } }
在上面的代碼中,我們為每個枚舉常量增加了一個name屬性,並在構造方法中為其賦值,同時增加了一個getName()方法,用來獲得該屬性的值。
Season season = Season.SUMMER; System.out.println(season.getName());
在使用時,我們可以通過調用枚舉類型的屬性來獲取相關信息,如上面的例子中,我們使用了getName()方法來獲得枚舉常量的名字。
3.2、枚舉類型的方法
public enum Season { SPRING("春天", 1), SUMMER("夏天", 2), AUTUMN("秋天", 3), WINTER("冬天", 4); private String name; private int index; Season(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public int getIndex() { return index; } public static Season getSeasonById(int index) { Season[] seasons = Season.values(); for(Season season : seasons) { if(season.getIndex() == index) { return season; } } return null; } }
在上面的代碼中,我們增加了一個index屬性,並在構造方法中為其賦值,同時增加了一個getIndex()方法來獲得該屬性的值。另外,我們還增加了一個靜態方法getSeasonById(),用來根據index獲得對應的Season類型。
Season season = Season.getSeasonById(2); System.out.println(season.getName());
在使用時,我們可以通過調用枚舉類型的方法來獲取相關信息,如上面的例子中,我們使用了getSeasonById()方法來根據指定index獲得對應的枚舉類型。
四、Java Enum類的高級用法
1、枚舉類型的實現介面
public interface Action { void doSomething(); } public enum Season implements Action { SPRING("春天", 1) { @Override public void doSomething() { System.out.println("春天來了,萬物復甦"); } }, SUMMER("夏天", 2) { @Override public void doSomething() { System.out.println("夏天來了,熱情奔放"); } }, AUTUMN("秋天", 3) { @Override public void doSomething() { System.out.println("秋天來了,金風玉露"); } }, WINTER("冬天", 4) { @Override public void doSomething() { System.out.println("冬天來了,白雪皚皚"); } }; private String name; private int index; Season(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public int getIndex() { return index; } public static Season getSeasonById(int index) { Season[] seasons = Season.values(); for(Season season : seasons) { if(season.getIndex() == index) { return season; } } return null; } }
在上面的代碼中,我們定義了一個Action介面,並同時實現了Season枚舉類型。在每個枚舉常量中,我們都覆蓋了doSomething()方法,用來展示不同季節的特徵。
Season season = Season.SUMMER; season.doSomething();
在使用時,我們可以直接調用該枚舉類型實現的介面方法,例如上面的例子中,我們通過調用doSomething()方法來展示對應枚舉類型的特徵。
2、使用枚舉常量的構造方法
public enum Season { SPRING("春天", 1), SUMMER("夏天", 2), AUTUMN("秋天", 3), WINTER("冬天", 4); private String name; private int index; Season(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public int getIndex() { return index; } public static Season getSeasonById(int index) { Season[] seasons = Season.values(); for(Season season : seasons) { if(season.getIndex() == index) { return season; } } return null; } }
在上面的代碼中,我們在Season枚舉類型的構造方法中使用了兩個參數name和index來初始化枚舉常量。通過這種方式,我們可以在枚舉類型中自定義構造方法,來滿足特定的需求。
Season season = new Season("春天", 1); System.out.println(season.getName());
但是需要注意的是,這裡對象season實際上是通過編譯器生成一個新的Season對象來實例化的,它不是枚舉類型中的常量,而是普通的對象,因此也就無法使用枚舉類型定義的方法。
3、使用枚舉常量的實例域
public enum Season { SPRING("春天", "一"), SUMMER("夏天", "二"), AUTUMN("秋天", "三"), WINTER("冬天", "四"); private String name; private String code; Season(String name, String code) { this.name = name; this.code = code; } public String getName() { return name; } public String getCode() { return code; } }
在上面的代碼中,我們在Season枚舉類型中增加了一個code實例域,用來存儲各個季節的代碼。通過這種方式,我們可以在枚舉類型中保存更多的信息。
4、使用枚舉常量的抽象方法
public enum Season { SPRING("春天", 1) { @Override public String getDesc() { return "萬物復甦"; } }, SUMMER("夏天", 2) { @Override public String getDesc() { return "熱情奔放"; } }, AUTUMN("秋天", 3) { @Override public String getDesc() { return "金風玉露"; } }, WINTER("冬天", 4) { @Override public String getDesc() { return "白雪皚皚"; } }; private String name; private int index; Season(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public int getIndex() { return index; } public abstract String getDesc(); }
在上面的代碼中,我們在Season枚舉類型中增加了一個抽象方法getDesc(),該方法在每個枚舉常量中都需要被具體實現。通過這種方式,我們可以在枚舉類型中定義更多的行為,並實現多態性的效果。
Season season = Season.SUMMER; System.out.println(season.getDesc());
在使用時,我們可以通過調用枚舉類型的抽象方法來獲取不同季節的特點,如上面的例子,在調用getDesc()方法時會根據具體的Season枚舉常量實現方法的不同而返回不同的結果。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/160481.html