1、枚举概念
在Java中枚举使用enum关键字表示,它是一种非常有用的特性,可以理解为具体特定性质的类。Enum不仅Java有,C和C++也有这个概念。例如:
1 public enum Family {
2
3 FATHER,
4
5 MOTHER,
6
7 SON,
8
9 DAUGHTER;
10
11 }
这是一个Family枚举类,总共有4个值,因为枚举类型都是常量,所以用大写字母表示
1 //使用枚举
2
3 class UseEnum {
4
5 public static void main(String[] args) {
6
7 Family f = Family.FATHER;
8
9 System.out.println(f);
10
11 }
12
13 }
运行结果:
2、枚举特性
(1)当创建完enum枚举类后,编译器会自动为enum添加toString()方法,能够方便显示enum实例的具体名字。除了toString()方法,编译器还会添加ordinal()方法,这个方法用来表示enum常量的声明顺序,以及values()方法显示顺序的值。
1 public enum Family {
2
3 FATHER,
4
5 MOTHER,
6
7 SON,
8
9 DAUGHTER;
10
11 }
12
13 class EnumUse {
14
15 public static void main(String[] args) {
16
17 for (Family family : Family.values()) {
18
19 System.out.println(family + ",ordinal_" + family.ordinal());
20
21 }
22
23
24
25 }
26
27 }
运行结果:
(2)枚举可以静态导入包,导入静态包的时候可以不用输入枚举类名.变量,可以直接用常量。使用enum和static关键字就能做到静态导入包。
枚举和普通类一样,除了枚举中能够方便快捷的定义常量,日常开发用的public static final XXX都可以用枚举类定义,枚举中也能定义属性和方法。
1 package day07;
2
3
4
5 public enum OrdinalEnum {
6
7 WEST("west"),
8
9 EAST("east"),
10
11 SOUTH("south"),
12
13 MORTH("north");
14
15 String description;
16
17
18
19 OrdinalEnum(String description) {
20
21 this.description = description;
22
23 }
24
25
26
27 public String getDescription() {
28
29 return description;
30
31 }
32
33
34
35 public void SetDescripiton(String description) {
36
37 this.description = description;
38
39 }
40
41
42
43 public static void main(String[] args) {
44
45 for (OrdinalEnum ordinalEnum : OrdinalEnum.values()) {
46
47 System.out.println(ordinalEnum.getDescription());
48
49 }
50
51 }
52
53 }
运行结果:
(3)Switch可以和enum一起使用,例如构造一个小型状态机:
1 package day07;
2
3
4
5 enum Signal {
6
7 GREEN, YELLOW, RED
8
9 }
10
11
12
13 public class TrafficLight {
14
15 Signal color = Signal.RED;
16
17
18
19 public void change() {
20
21 switch (color) {
22
23 case RED:
24
25 color = Signal.GREEN;
26
27 break;
28
29 case GREEN:
30
31 color = Signal.RED;
32
33 break;
34
35 case YELLOW:
36
37 color = Signal.YELLOW;
38
39 break;
40
41 }
42
43 }
44
45 }
(4)Enum隐式的继承与Enum类,Enum类位于java.lang包下,可以自动引用。Class类中有三个关于Enum的方法:getEnumConstants():T[],getEnumConstantsShared():T[],isEnum():boolea。前两个用于获取enum常量,isEnum用于判断是否是枚举类型。
3、EnumSet和EnumMap
- EnumSet是JDK1.5引入的,EnumSet的设计充分考虑了速度因素,使用EnumSet可以作为Enum的替代者,因为它的效率比较高。
- EnumMap是一种特殊的Map,它要求其中的key键值是来自一个enum。因为EumMap速度也非常快,所以可以使用EumMap的key进行快速查找。
枚举是Java中很小的功能,但是这个技巧有时候能够让代码变得优雅和简洁。