前言
枚舉是 Java1.5 引入的新特性,通過關鍵字 enum 來定義枚舉類。
應用
定義
- 關鍵字enum可以將一組具名的值的有限集合創建為一種新的類型,而這些具名的值可以作為常規的程序組件使用。
1
2
3
|
enum WeekEnum { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend } |
基本Enum特性
- 枚舉類的定義
1
2
3
4
5
6
7
8
9
10
11
12
|
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 實例
1
2
3
4
5
6
7
8
9
10
|
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 方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
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
- 正確用法
1
2
3
4
5
6
7
8
9
|
WeekEnum weekEnum = WeekEnum.Friday; switch (weekEnum) { case Friday: System.out.println(weekEnum); break ; case Saturday: break ; } |
- 錯誤用法
1
2
3
4
5
6
7
8
9
|
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不能繼承其他類,但可以實現一個或多個接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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中的順序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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 方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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(); } } } |
枚舉值向枚舉類型轉換
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
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 } } |
以上就是java枚舉類型-Enum的詳細內容,更多關于java Enum的資料請關注服務器之家其它相關文章!
原文鏈接:https://www.cnblogs.com/maggieq8324/p/15177334.html