一文教會你使用Java中的枚舉Enmu
枚舉是 Java 中的一種特殊類型,它用于表示一組固定值。枚舉中定義的每個值稱為一個枚舉常量,它們在聲明時都必須賦予一個固定的值,即枚舉值。相比于使用常量或者 final 字段來表示一組固定值,枚舉更加類型安全、易讀、易維護。
Java 中的枚舉類型是通過關鍵字 enum 來定義的。一個簡單的示例代碼如下:
public enum WeekDay { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; }
這個示例代碼定義了一個 WeekDay 枚舉類型,其中包含了一周中的七個枚舉常量。需要注意的是,枚舉常量名稱通常使用大寫字母,這是一種約定俗成的規(guī)范。
在使用枚舉類型時,可以直接使用枚舉常量來表示對應的值。例如,可以定義一個方法來判斷指定的日期是不是工作日:
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 枚舉常量作為參數,根據該參數判斷當前日期是否是工作日。由于 WeekDay 中的枚舉常量是固定不變的,因此這種方式可以有效避免傳入無效的值或者字符串拼寫錯誤等問題。
除了定義簡單的枚舉類型之外,Java 中的枚舉還支持很多高級特性。
枚舉構造函數和字段
每個枚舉常量都實際上是一個枚舉實例,因此可以定義構造函數來初始化它們的狀態(tài)。枚舉構造函數只能是 private 或者 package-private(默認訪問權限),這是因為枚舉常量的創(chuàng)建只能在枚舉類內部進行。
例如,可以在 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 字段,用于表示每個工作日的工作時間長度。通過添加一個構造函數,可以將每個枚舉常量的工作時間長度初始化為對應的值。
枚舉實現接口
Java 中的枚舉還可以實現一個或多個接口,這使得枚舉常量可以像普通類一樣擁有方法和行為。例如,可以定義一個接口來表示一種顏色,然后讓枚舉常量實現該接口:
public interface Color { String getName(); } public enum Rainbow implements Color { RED("紅"), ORANGE("橙"), YELLOW("黃"), GREEN("綠"), CYAN("青"), BLUE("藍"), PURPLE("紫"); private final String name; private Rainbow(String name) { this.name = name; } @Override public String getName() { return name; } }
在這個示例代碼中,Rainbow 枚舉實現了一個 Color 接口,該接口定義了 getName() 方法。通過實現該接口,Rainbow 枚舉常量可以返回對應顏色的名稱。
枚舉的比較和排序
枚舉常量之間的比較可以使用 "== "運算符,這是因為每個枚舉常量實際上都是一個獨立的對象。例如,判斷兩個枚舉常量是否相等可以使用以下語句:
if (day == WeekDay.MONDAY) { ... }
枚舉類型還支持比較操作,包括 equals() 方法和 compareTo() 方法。默認情況下,枚舉常量的比較順序是它們在枚舉中的聲明順序,也可以通過實現 Comparable 接口來自定義枚舉常量的比較方式。
例如,可以對 WeekDay 枚舉實現 Comparable 接口,按照工作日的順序進行排序:
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 枚舉實現了 Comparable 接口,重寫了 compareTo() 方法,按照每個工作日的工作時間長度進行比較。通過在 compareTo() 方法中調用 Integer.compare() 方法,實現了按照整數值進行比較。
枚舉的序列化和反序列化
Java 中的枚舉類型可以進行序列化和反序列化,如在網絡傳輸或保存到文件中。由于枚舉常量在一個程序中是固定不變的,因此只需要序列化枚舉常量的名稱即可。
例如,可以使用 ObjectOutputStream 將 WeekDay 枚舉序列化到文件中:
try (ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("weekdays.bin"))) { out.writeObject(WeekDay.MONDAY); } catch (IOException ex) { ex.printStackTrace(); }
在反序列化時,可以使用 ObjectInputStream 讀取枚舉常量的名稱,并通過 Enum.valueOf() 方法將其轉換為對應的枚舉常量:
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() 方法將其轉換為 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 枚舉類型,其中包含三個顏色常量,每個常量都有一個對應的色彩代碼。在使用時可以使用 Color.RED.getCode() 來獲取紅色的色彩代碼。
狀態(tài)枚舉
public enum Status { NEW("新建"), OPEN("已開啟"), CLOSED("已關閉"); private final String desc; private Status(String desc) { this.desc = desc; } public String getDesc() { return desc; } }
這個示例代碼定義了一個簡單的 Status 枚舉類型,其中包含三個狀態(tài)常量,每個常量都有一個對應的狀態(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 枚舉類型,其中包含七個常量,前五個為工作日,后兩個為非工作日。每個工作日都有一個對應的工作時間長度,在 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é)常量,每個常量都有一個對應的名稱和索引。通過 getByIndex() 方法可以根據索引獲取對應的季節(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 枚舉類型,其中包含三個常量,分別表示紅、綠、黃三種交通信號燈。該枚舉實現了 next() 方法,返回下一個狀態(tài),以及 toString() 方法,返回對應的信號燈名稱和持續(xù)時間。在使用時可以使用 TrafficLight.RED.getSeconds() 來獲取紅燈的持續(xù)時間。
總結
枚舉類型是 Java 中的一種特殊類型,它用于表示一組固定值。Java 枚舉類型具有以下優(yōu)點:
- 類型安全:枚舉類型可以避免傳入無效的值或者字符串拼寫錯誤等問題。
- 易讀易維護:通過采用命名約定和語義約定,使得代碼更加可讀、易于理解和維護。
- 擴展性:枚舉類型支持定義方法、字段、接口等高級特性,使得枚舉常量能夠像普通類一樣擁有行為和狀態(tài)。
Java 枚舉類型的使用場景包括但不限于:
- 狀態(tài)碼、狀態(tài)標識等一組固定值的表示。
- 星期、月份、季節(jié)等一組固定值的表示。
- 顏色、性別、血型等一組固定取值的表示。
- 開關、狀態(tài)機、狀態(tài)轉換等復雜業(yè)務邏輯的建模。
總之,在選擇使用枚舉類型時需要考慮其表達意義的穩(wěn)定性和清晰度,以及代碼的可讀性和可維護性。
到此這篇關于一文教會你使用Java中的枚舉Enmu的文章就介紹到這了,更多相關Java枚舉內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Shell重啟SpringBoot項目腳本的示例代碼(含服務守護)
本文介紹了如何使用?Bash?腳本來管理和守護運行服務,將展示一個示例腳本,該腳本可以停止、啟動和守護運行一個服務,并提供了相應的解釋和用法說明,文章通過代碼示例介紹的非常詳細,需要的朋友可以參考下2023-11-11java 利用反射機制,獲取實體所有屬性和方法,并對屬性賦值
這篇文章主要介紹了 java 利用反射機制,獲取實體所有屬性和方法,并對屬性賦值的相關資料,需要的朋友可以參考下2017-01-01