Java 代码之枚举类

枚举类

1. 使用 == 比较枚举类型

由于枚举类型确保 JVM 中仅存在一个常量实例,因此我们可以安全地使用 == 运算符比较两个变量,== 运算符可提供编译时和运行时的安全性。

1. 编译时安全性

两个不同枚举类型进行比较,使用 equal() 方法可以比较,而使用 == 编译器会表示类型不兼容错误。

1
2
3
4
// IDE 可能会提示类型错误,但可以运行
if(testPz.getStatus().equals(TestColor.GREEN));
// 编译器直接报错
if(testPz.getStatus() == TestColor.GREEN);

2. 运行时安全性

如果两个值均为 null ,使用 equals() 方法会引发 NullPointerException,== 则不会

1
2
if(testPz.getStatus().equals(Pizza.PizzaStatus.DELIVERED));
if(testPz.getStatus() == Pizza.PizzaStatus.DELIVERED);

2. 属性、方法和构造函数

可以在每个属性中, @Override 具体方法,起到 switch 作用。

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
public class Pizza {

private PizzaStatus status;

public PizzaStatus getStatus() {
return status;
}

public void setStatus(PizzaStatus status) {
this.status = status;
}

public boolean isDeliverable() {
return this.status.isReady();
}

public void printTimeToDeliver() {
System.out.println("Time to delivery is " + this.getStatus().getTimeToDelivery());
}

public enum PizzaStatus {
ORDERED(5) {
@Override
public boolean isOrdered() {
return true;
}
},
READY(2) {
@Override
public boolean isReady() {
return true;
}
},
DELIVERED(0) {
@Override
public boolean isDelivered() {
return true;
}
};

private int timeToDelivery;

PizzaStatus(int timeToDelivery) {
this.timeToDelivery = timeToDelivery;
}

public int getTimeToDelivery() {
return timeToDelivery;
}

public boolean isOrdered() {
return false;
}

public boolean isReady() {
return false;
}

public boolean isDelivered() {
return false;
}

}

}

/*调用*/
public static void main(String[] args) {
Pizza testPz = new Pizza();
testPz.setStatus(Pizza.PizzaStatus.READY);
assertTrue(testPz.isDeliverable());
}

3. EnumSet

EnumSet 是一个用来操作 Enum 的集合,是一个抽象类,它有两个继承类:JumboEnumSetRegularEnumSet。它的特点也是速度非常快,因为每次 add 的时候,每个枚举值只占一个长整型的一位。
常用方法

  • EnumSet.noneOf() : 创建一个空的 set
  • EnumSet.allOf() : 创建一个满的 set
  • EnumSet.range() : 创建指定范围 set
  • EnumSet.complementOf() : 补集创建 set
  • EnumSet.copyOf() : 复制创建 set

4. EnumMap

如果 key是 enum 类型,推荐使用 EnumMap,既保证速度,也不浪费空间。
其不允许出现 null 的 key 值,但是允许出现 null 的 value。