枚舉(enum)是Java中一種比較特殊的數據類型,它專門用於定義常量(如某些狀態、類型、級別等)的集合。枚舉類型始於Java 1.5版本,其中新增加了enum關鍵字,可以定義一個枚舉類型。在Java中,枚舉類型可以像類一樣擁有自己的屬性和方法。本文將從以下幾個方面對Java中的枚舉(enum)用法進行詳細闡述。
一、枚舉定義與初始化
在Java語言中,通過使用關鍵字enum來定義枚舉。
enum Season{ SPRING,SUMMER,AUTUMN,WINTER; }
上述代碼定義了一個Season的枚舉類型,其中包含了四個常量(SPRING、SUMMER、AUTUMN、WINTER),它們都是Season類型的實例。枚舉類型定義的格式為:enum 枚舉類型名稱 { 常量1,常量2,……常量n }
枚舉在使用時可以直接通過枚舉常量來進行初始化,例如:
public class EnumTest{ Season season; public EnumTest(Season season){ this.season = season; } public void describe(){ switch(season){ case SPRING: System.out.println("現在是春天!"); break; case SUMMER: System.out.println("現在是夏天!"); break; case AUTUMN: System.out.println("現在是秋天!"); break; case WINTER: System.out.println("現在是冬天!"); break; default: System.out.println("不知道現在是什麼季節!"); break; } } public static void main(String[] args){ EnumTest test1 = new EnumTest(Season.SPRING); EnumTest test2 = new EnumTest(Season.SUMMER); EnumTest test3 = new EnumTest(Season.AUTUMN); EnumTest test4 = new EnumTest(Season.WINTER); test1.describe(); test2.describe(); test3.describe(); test4.describe(); } }
上述代碼中,我們定義了一個名為Season的枚舉類型,然後在EnumTest類中定義了一個用於描述季節的方法,這個方法的參數是一個Season類型的枚舉常量。最後在main方法中我們通過分別傳遞不同的Season常量來對其進行測試,並打印出當前季節的描述。
二、使用枚舉常量
在Java中,枚舉常量也是枚舉類型的實例。由於枚舉常量可以看作是一種特殊的實例,因此可以像普通實例一樣訪問它們的成員變量和方法。
枚舉常量還可以有自己的值,可以像下面這樣對枚舉常量進行賦值:
enum WeekDay{ MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"), THURSDAY("星期四"),FRIDAY("星期五"),SATURDAY("星期六"),SUNDAY("星期日"); private String chineseName; WeekDay(String name){ chineseName = name; } public String getChineseName(){ return chineseName; } }
上述代碼中定義了一個WeekDay枚舉類型,每個枚舉常量(MONDAY、TUESDAY、……SUNDAY)都有一個中文名稱。每個枚舉常量都可以通過getChineseName()方法來獲取它的中文名稱。
三、枚舉和接口的使用
Java中的枚舉類型可以實現接口,這讓枚舉在某些場景下變得更加靈活。例如:
interface Operation{ double apply(double x, double y); } enum BasicOperation implements Operation{ PLUS("+") { public double apply(double x, double y) { return x + y; } }, MINUS("-") { public double apply(double x, double y) { return x - y; } }, TIMES("*") { public double apply(double x, double y) { return x * y; } }, DIVIDE("/") { public double apply(double x, double y) { return x / y; } }; private final String symbol; BasicOperation(String symbol) { this.symbol = symbol; } @Override public String toString() { return symbol; } } public class UseEnum{ public static void main(String[] args){ double x = 10.0, y = 5.0; for(BasicOperation op : BasicOperation.values()){ System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y)); } } }
上述代碼中,我們定義了一個Operation接口,這個接口包含了一個apply()方法,用於計算兩個double類型參數的值。然後我們定義了一個BasicOperation枚舉類型,其中每個枚舉常量實現了Operation接口的apply()方法。最後在UseEnum類中,我們通過枚舉的values()方法來遍歷BasicOperation枚舉類型中的所有枚舉常量,分別對它們執行apply()方法,並輸出運算結果。
四、枚舉和泛型的使用
Java中的枚舉類型也可以用於泛型類或泛型方法的定義中。例如:
public class EnumMapTest{ public static void main(String[] args){ EnumMap map = new EnumMap(WeekDay.class); map.put(WeekDay.MONDAY, "星期一"); map.put(WeekDay.TUESDAY, "星期二"); map.put(WeekDay.WEDNESDAY, "星期三"); map.put(WeekDay.THURSDAY, "星期四"); map.put(WeekDay.FRIDAY, "星期五"); map.put(WeekDay.SATURDAY, "星期六"); map.put(WeekDay.SUNDAY, "星期日"); System.out.println(map); } }
上述代碼中,我們定義了一個EnumMap類型的對象,並指定它的鍵值類型是WeekDay和String。接着我們向這個EnumMap對象中放入了7個鍵值對,最後用println()方法輸出這個EnumMap對象。由於EnumMap的實現內部使用數組來存儲鍵值對,因此EnumMap對鍵的判等比HashMap要快。
五、枚舉對比和序列化
Java中的Enumeration接口雖然與枚舉相關,但是它並不支持添加或刪除元素等操作。而枚舉類型則可以支持這些操作,因此在Java中建議使用枚舉類型來代替Enumeration接口。
Java中的枚舉類型默認是實現Serializable接口的,並且它們的序列化和反序列化都是在JVM中自動進行的。所以我們不用考慮用於序列化和反序列化的IO操作,這就大大節省了我們的時間和精力。
六、小結
本文對Java中枚舉類型的定義、初始化、使用方法、接口和泛型等多個方面進行了詳細的闡述,並給出了相應的代碼示例。枚舉類型在Java中是一種比較特殊的數據類型,需要熟練掌握這些使用方法才能更好地利用它們來完成編程任務。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/151957.html