前言

列舉是 Java1.5 引入的新特性,通過關鍵字 enum 來定義列舉類。

應用

定義

  • 關鍵字enum可以將一組具名的值的有限集合建立為一種新的型別,而這些具名的值可以作為常規的程式元件使用。
enum WeekEnum {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend
}

基本Enum特性

  • 列舉類的定義
enum WeekEnum {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend; public static void main(String[] args) {
for (WeekEnum item : WeekEnum.values()) {
System.out.println(item.ordinal());
System.out.println(item.name());
System.out.println(item.getDeclaringClass());
System.out.println(Enum.valueOf(WeekEnum.class, item.name()));
}
}
}
  • 常用方法
方法 說明
values() 可以遍歷enum例項,其返回enum例項的陣列
ordinal() 返回每個例項在宣告時的次序
name() 返回enum例項宣告時的名稱
getDeclaringClass() 返回其所屬的enum類
Enum.valueOf() 根據給定的名稱返回相應的enum例項

Enum的靜態匯入

  • static import 可以將 enum 例項的識別符號帶入當前類,無需再用enum型別來修飾 enum 例項
import static com.coisini.springbootlearn.WeekEnum.*;

public class WeekEnumTest {

    public static void main(String[] args) {
System.out.println(Monday.name()); // Monday
System.out.println(Tuesday.name()); //Tuesday
} }

Enum中新增新方法

  • Enum 可以看做是一個常規類(除了不能繼承自一個enum),enum 中可以新增方法和 main 方法。

public enum WeekEnum { Monday(1, "週一"),
Tuesday(2, "週二"),
Wednesday(3, "週三"),
Thursday(4, "週四"),
Friday(5, "週五"),
Saturday(6, "週六"),
weekend(7, "周天"); private Integer value;
private String description; /**
* 構造方法
* @param value
* @param description
*/
WeekEnum(Integer value, String description) {
this.value = value;
this.description = description;
} /**
* 獲取value
* @return
*/
public Integer getValue() { return this.value; } /**
* 獲取Desc
* @return
*/
public String getDesc() { return this.description; } /**
* 重寫ToString方法
* @return
*/
public String toString() {
return this.getValue() + " " + this.getDesc();
} public static void main(String[] args) {
for (WeekEnum item : WeekEnum.values()) {
System.out.println(item);
}
} }

Switch語句中的Enum

  • 正確用法
WeekEnum weekEnum = WeekEnum.Friday;

switch (weekEnum) {
case Friday:
System.out.println(weekEnum);
break;
case Saturday:
break;
}
  • 錯誤用法
WeekEnum weekEnum = WeekEnum.Friday;

switch(weekEnum) {
// An enum switch case label must be the unqualified name of an enumeration constant
case WeekEnum.Friday:
break;
default:
break;
}
  • 常規情況下必須使用 enum 型別來修飾 enum 例項,但在 case 語句中不必如此。

Enum的繼承

  • 所有的enum都繼承自java.lang.Enum類,由於Java不支援多重繼承,所以enum不能繼承其他類,但可以實現一個或多個介面。
public interface Period {

    enum WeekEnum implements Period{
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend
} enum MonthEnum implements Period{
January, February, March, April, May, June
} class PeriodTest {
public static void main(String[] args) {
Period week = WeekEnum.Friday;
Period month = MonthEnum.April; System.out.println(month + " " + week); // April Friday
}
} }

EnumSet的使用

  • enum 中不能刪除和新增元素,Java SE5 引入了EnumSet,其元素必須來自一個 enum 。
import java.util.EnumSet;

enum EnumSetTest {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend; public static void main(String[] args) {
EnumSet<EnumSetTest> points = EnumSet.noneOf(EnumSetTest.class);
points.add(Monday);
System.out.println(points); // [Monday] points.addAll(EnumSet.of(Tuesday, Wednesday));
System.out.println(points); // [Monday, Tuesday, Wednesday] points = EnumSet.allOf(EnumSetTest.class);
System.out.println(points); // [Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend] points.removeAll(EnumSet.of(Monday, Tuesday));
System.out.println(points); // [Wednesday, Thursday, Friday, Saturday, weekend] points = EnumSet.complementOf(points);
System.out.println(points); // [Monday, Tuesday]
}
}

EnumMap的使用

  • EnumMap 是一種特殊的 Map,其 key 值必須來自一個 enum,enum 例項定義的次序決定了其在EnumMap中的順序。
import java.util.EnumMap;
import java.util.Map; public enum EnumMapTest {
MON, TUE, WED, THU, FRI, SAT, WEE; public static void main(String[] args) {
EnumMap<EnumMapTest, String> enumMap = new EnumMap<EnumMapTest, String>(EnumMapTest.class);
enumMap.put(MON, "Monday");
enumMap.put(TUE, "Tuesday"); for (Map.Entry<EnumMapTest, String> em : enumMap.entrySet()) {
System.out.println(em.getKey() + " " + em.getValue()); // MON Monday TUE Tuesday
}
}
}

常量相關方法

  • enum 允許為 enum 例項編寫方法,為每個 enum 例項賦予不同的行為,要實現常量的相關方法需要為 enum 定義- 實現 abstract 方法。
public enum EnumAbstract {
MON {
void getDetail() {
System.out.println("Monday");
}
},
TUE {
void getDetail() {
System.out.println("Tuesday");
}
},
WED {
void getDetail() {
System.out.println("Wednesday");
}
}; abstract void getDetail(); public static void main(String[] args) {
for (EnumAbstract ea : EnumAbstract.values()) {
ea.getDetail();
}
} }

列舉值向列舉型別轉換

import java.util.stream.Stream;

public enum WeekEnum {

    Monday(1, "週一"),
Tuesday(2, "週二"),
Wednesday(3, "週三"),
Thursday(4, "週四"),
Friday(5, "週五"),
Saturday(6, "週六"),
weekend(7, "周天"); private Integer value;
private String description; /**
* 構造方法
* @param value
* @param description
*/
WeekEnum(Integer value, String description) {
this.value = value;
this.description = description;
} /**
* 列舉值向列舉型別轉換
* @param value
* @return
*/
public static WeekEnum toWeekEnum(int value) {
return Stream.of(WeekEnum.values())
.filter(item -> item.value == value)
.findAny()
.orElse(null);
} public static void main(String[] args) {
System.out.println(WeekEnum.toWeekEnum(1)); // Monday
} }

- End -



夢想是鹹魚
關注一下吧