枚举类
1. 使用 == 比较枚举类型
由于枚举类型确保 JVM 中仅存在一个常量实例,因此我们可以安全地使用 ==
运算符比较两个变量,==
运算符可提供编译时和运行时的安全性。
1. 编译时安全性
两个不同枚举类型进行比较,使用 equal()
方法可以比较,而使用 ==
编译器会表示类型不兼容错误。
1 2 3 4
| 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
的集合,是一个抽象类,它有两个继承类:JumboEnumSet
和 RegularEnumSet
。它的特点也是速度非常快,因为每次 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。