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

