枚举

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中很小的功能,但是这个技巧有时候能够让代码变得优雅和简洁。

欢迎批评指正,提出问题,谢谢!
原文地址:https://www.cnblogs.com/xxeleanor/p/14399974.html