一文教會你使用Java中的枚舉Enmu
枚舉是 Java 中的一種特殊類型,它用于表示一組固定值。枚舉中定義的每個值稱為一個枚舉常量,它們在聲明時都必須賦予一個固定的值,即枚舉值。相比于使用常量或者 final 字段來表示一組固定值,枚舉更加類型安全、易讀、易維護(hù)。
Java 中的枚舉類型是通過關(guān)鍵字 enum 來定義的。一個簡單的示例代碼如下:
public enum WeekDay { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; }
這個示例代碼定義了一個 WeekDay 枚舉類型,其中包含了一周中的七個枚舉常量。需要注意的是,枚舉常量名稱通常使用大寫字母,這是一種約定俗成的規(guī)范。
在使用枚舉類型時,可以直接使用枚舉常量來表示對應(yīng)的值。例如,可以定義一個方法來判斷指定的日期是不是工作日:
public class Util { public static boolean isWorkday(WeekDay day) { switch (day) { case MONDAY: case TUESDAY: case WEDNESDAY: case THURSDAY: case FRIDAY: return true; default: return false; } } }
在這個示例代碼中,isWorkday() 方法接受一個 WeekDay 枚舉常量作為參數(shù),根據(jù)該參數(shù)判斷當(dāng)前日期是否是工作日。由于 WeekDay 中的枚舉常量是固定不變的,因此這種方式可以有效避免傳入無效的值或者字符串拼寫錯誤等問題。
除了定義簡單的枚舉類型之外,Java 中的枚舉還支持很多高級特性。
枚舉構(gòu)造函數(shù)和字段
每個枚舉常量都實際上是一個枚舉實例,因此可以定義構(gòu)造函數(shù)來初始化它們的狀態(tài)。枚舉構(gòu)造函數(shù)只能是 private 或者 package-private(默認(rèn)訪問權(quán)限),這是因為枚舉常量的創(chuàng)建只能在枚舉類內(nèi)部進(jìn)行。
例如,可以在 WeekDay 枚舉中添加一個字段用于表示每個工作日的工作時間長度:
public enum WeekDay { MONDAY(8), TUESDAY(8), WEDNESDAY(8), THURSDAY(8), FRIDAY(8), SATURDAY(0), SUNDAY(0); private final int workHours; private WeekDay(int workHours) { this.workHours = workHours; } public int getWorkHours() { return workHours; } }
在這個示例代碼中,WeekDay 枚舉定義了一個 workHours 字段,用于表示每個工作日的工作時間長度。通過添加一個構(gòu)造函數(shù),可以將每個枚舉常量的工作時間長度初始化為對應(yīng)的值。
枚舉實現(xiàn)接口
Java 中的枚舉還可以實現(xiàn)一個或多個接口,這使得枚舉常量可以像普通類一樣擁有方法和行為。例如,可以定義一個接口來表示一種顏色,然后讓枚舉常量實現(xiàn)該接口:
public interface Color { String getName(); } public enum Rainbow implements Color { RED("紅"), ORANGE("橙"), YELLOW("黃"), GREEN("綠"), CYAN("青"), BLUE("藍(lán)"), PURPLE("紫"); private final String name; private Rainbow(String name) { this.name = name; } @Override public String getName() { return name; } }
在這個示例代碼中,Rainbow 枚舉實現(xiàn)了一個 Color 接口,該接口定義了 getName() 方法。通過實現(xiàn)該接口,Rainbow 枚舉常量可以返回對應(yīng)顏色的名稱。
枚舉的比較和排序
枚舉常量之間的比較可以使用 "== "運(yùn)算符,這是因為每個枚舉常量實際上都是一個獨(dú)立的對象。例如,判斷兩個枚舉常量是否相等可以使用以下語句:
if (day == WeekDay.MONDAY) { ... }
枚舉類型還支持比較操作,包括 equals() 方法和 compareTo() 方法。默認(rèn)情況下,枚舉常量的比較順序是它們在枚舉中的聲明順序,也可以通過實現(xiàn) Comparable 接口來自定義枚舉常量的比較方式。
例如,可以對 WeekDay 枚舉實現(xiàn) Comparable 接口,按照工作日的順序進(jìn)行排序:
public enum WeekDay implements Comparable<WeekDay> { MONDAY(8), TUESDAY(8), WEDNESDAY(8), THURSDAY(8), FRIDAY(8), SATURDAY(0), SUNDAY(0); ... @Override public int compareTo(WeekDay other) { return Integer.compare(this.workHours, other.workHours); } }
在這個示例代碼中,WeekDay 枚舉實現(xiàn)了 Comparable 接口,重寫了 compareTo() 方法,按照每個工作日的工作時間長度進(jìn)行比較。通過在 compareTo() 方法中調(diào)用 Integer.compare() 方法,實現(xiàn)了按照整數(shù)值進(jìn)行比較。
枚舉的序列化和反序列化
Java 中的枚舉類型可以進(jìn)行序列化和反序列化,如在網(wǎng)絡(luò)傳輸或保存到文件中。由于枚舉常量在一個程序中是固定不變的,因此只需要序列化枚舉常量的名稱即可。
例如,可以使用 ObjectOutputStream 將 WeekDay 枚舉序列化到文件中:
try (ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("weekdays.bin"))) { out.writeObject(WeekDay.MONDAY); } catch (IOException ex) { ex.printStackTrace(); }
在反序列化時,可以使用 ObjectInputStream 讀取枚舉常量的名稱,并通過 Enum.valueOf() 方法將其轉(zhuǎn)換為對應(yīng)的枚舉常量:
try (ObjectInputStream in = new ObjectInputStream( new FileInputStream("weekdays.bin"))) { WeekDay day = WeekDay.valueOf(in.readUTF()); System.out.println(day); } catch (IOException | ClassNotFoundException ex) { ex.printStackTrace(); }
在這個示例代碼中,先使用 readUTF() 方法讀取序列化后的枚舉常量名稱(這里是 "MONDAY"),然后通過 valueOf() 方法將其轉(zhuǎn)換為 WeekDay 枚舉常量。
代碼示例
顏色枚舉
public enum Color { RED("#FF0000"), GREEN("#00FF00"), BLUE("#0000FF"); private final String code; private Color(String code) { this.code = code; } public String getCode() { return code; } }
這個示例代碼定義了一個簡單的 Color 枚舉類型,其中包含三個顏色常量,每個常量都有一個對應(yīng)的色彩代碼。在使用時可以使用 Color.RED.getCode() 來獲取紅色的色彩代碼。
狀態(tài)枚舉
public enum Status { NEW("新建"), OPEN("已開啟"), CLOSED("已關(guān)閉"); private final String desc; private Status(String desc) { this.desc = desc; } public String getDesc() { return desc; } }
這個示例代碼定義了一個簡單的 Status 枚舉類型,其中包含三個狀態(tài)常量,每個常量都有一個對應(yīng)的狀態(tài)描述。在使用時可以使用 Status.NEW.getDesc() 來獲取新建狀態(tài)的描述。
星期枚舉
public enum WeekDay { MONDAY(8), TUESDAY(8), WEDNESDAY(8), THURSDAY(8), FRIDAY(8), SATURDAY(0), SUNDAY(0); private final int workHours; private WeekDay(int workHours) { this.workHours = workHours; } public int getWorkHours() { return workHours; } public static boolean isWorkday(WeekDay day) { return day != SATURDAY && day != SUNDAY; } }
這個示例代碼定義了一個 WeekDay 枚舉類型,其中包含七個常量,前五個為工作日,后兩個為非工作日。每個工作日都有一個對應(yīng)的工作時間長度,在 isWorkday() 方法中判斷一個指定的日期是否為工作日。
季節(jié)枚舉
public enum Season { SPRING("春", 1), SUMMER("夏", 2), AUTUMN("秋", 3), WINTER("冬", 4); private final String name; private final int index; private Season(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public int getIndex() { return index; } public static Season getByIndex(int index) { for (Season season : values()) { if (season.getIndex() == index) { return season; } } throw new IllegalArgumentException("Invalid index: " + index); } }
這個示例代碼定義了一個 Season 枚舉類型,其中包含四個季節(jié)常量,每個常量都有一個對應(yīng)的名稱和索引。通過 getByIndex() 方法可以根據(jù)索引獲取對應(yīng)的季節(jié)枚舉值。
交通信號燈枚舉
public enum TrafficLight { RED(30), GREEN(60), YELLOW(5); private final int seconds; private TrafficLight(int seconds) { this.seconds = seconds; } public int getSeconds() { return seconds; } public TrafficLight next() { switch (this) { case RED: return GREEN; case GREEN: return YELLOW; case YELLOW: return RED; default: throw new IllegalStateException("Invalid state"); } } @Override public String toString() { return name() + "(" + seconds + ")"; } }
這個示例代碼定義了一個 TrafficLight 枚舉類型,其中包含三個常量,分別表示紅、綠、黃三種交通信號燈。該枚舉實現(xiàn)了 next() 方法,返回下一個狀態(tài),以及 toString() 方法,返回對應(yīng)的信號燈名稱和持續(xù)時間。在使用時可以使用 TrafficLight.RED.getSeconds() 來獲取紅燈的持續(xù)時間。
總結(jié)
枚舉類型是 Java 中的一種特殊類型,它用于表示一組固定值。Java 枚舉類型具有以下優(yōu)點:
- 類型安全:枚舉類型可以避免傳入無效的值或者字符串拼寫錯誤等問題。
- 易讀易維護(hù):通過采用命名約定和語義約定,使得代碼更加可讀、易于理解和維護(hù)。
- 擴(kuò)展性:枚舉類型支持定義方法、字段、接口等高級特性,使得枚舉常量能夠像普通類一樣擁有行為和狀態(tài)。
Java 枚舉類型的使用場景包括但不限于:
- 狀態(tài)碼、狀態(tài)標(biāo)識等一組固定值的表示。
- 星期、月份、季節(jié)等一組固定值的表示。
- 顏色、性別、血型等一組固定取值的表示。
- 開關(guān)、狀態(tài)機(jī)、狀態(tài)轉(zhuǎn)換等復(fù)雜業(yè)務(wù)邏輯的建模。
總之,在選擇使用枚舉類型時需要考慮其表達(dá)意義的穩(wěn)定性和清晰度,以及代碼的可讀性和可維護(hù)性。
到此這篇關(guān)于一文教會你使用Java中的枚舉Enmu的文章就介紹到這了,更多相關(guān)Java枚舉內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Jackson實現(xiàn)Map與Bean互轉(zhuǎn)方式
這篇文章主要介紹了使用Jackson實現(xiàn)Map與Bean互轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Shell重啟SpringBoot項目腳本的示例代碼(含服務(wù)守護(hù))
本文介紹了如何使用?Bash?腳本來管理和守護(hù)運(yùn)行服務(wù),將展示一個示例腳本,該腳本可以停止、啟動和守護(hù)運(yùn)行一個服務(wù),并提供了相應(yīng)的解釋和用法說明,文章通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11HttpClient實現(xiàn)遠(yuǎn)程調(diào)用
這篇文章主要為大家詳細(xì)介紹了HttpClient實現(xiàn)遠(yuǎn)程調(diào)用的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08java 利用反射機(jī)制,獲取實體所有屬性和方法,并對屬性賦值
這篇文章主要介紹了 java 利用反射機(jī)制,獲取實體所有屬性和方法,并對屬性賦值的相關(guān)資料,需要的朋友可以參考下2017-01-01java算法題解LeetCode30包含min函數(shù)的棧實例
這篇文章主要為大家介紹了java算法題解LeetCode30包含min函數(shù)的棧實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01