enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承java.lang.Enum类。
枚举在很多时候会和常量拿来对比,可能因为本身我们大量实际使用枚举的地方就是为了替代常量。那么这种方式由什么优势呢?
以这种方式定义的常量使代码更具可读性,允许进行编译时检查,预先记录可接受值的列表,并避免由于传入无效值而引起的意外行为。
下面示例定义一个简单的枚举类型 pizza 订单的状态,共有三种 ORDERED, READY, DELIVERED状态:
package com.jesper.seckill.config;
public class Test {
public enum PizzaStatus {
ORDERED,
READY,
DELIVERED;
}
public static void main(String[] args) {
// ORDERED
System.out.println(PizzaStatus.ORDERED.name());
// ORDERED
System.out.println(PizzaStatus.ORDERED);
// class java.lang.String
System.out.println(PizzaStatus.ORDERED.name().getClass());
// class com.jesper.seckill.config.Test$PizzaStatus
System.out.println(PizzaStatus.ORDERED.getClass());
}
}
简单来说,我们通过上面的代码避免了定义常量,我们将所有和 pizza 订单的状态的常量都统一放到了一个枚举类型里面。
由于枚举类型确保JVM中仅存在一个常量实例,因此我们可以安全地使用 == 运算符比较两个变量,如上例所示;此外,== 运算符可提供编译时和运行时的安全性。
首先,让我们看一下以下代码段中的运行时安全性,其中 ==
运算符用于比较状态,并且如果两个值均为null 都不会引发 NullPointerException。相反,如果使用equals方法,将抛出 NullPointerException:
if(testPz.getStatus().equals(Pizza.PizzaStatus.DELIVERED));
if(testPz.getStatus() == Pizza.PizzaStatus.DELIVERED);
对于编译时安全性,我们看另一个示例,两个不同枚举类型进行比较,使用equal方法比较结果确定为true,因为getStatus方法的枚举值与另一个类型枚举值一致,但逻辑上应该为false。这个问题可以使用==操作符避免。因为编译器会表示类型不兼容错误:
if(testPz.getStatus().equals(TestColor.GREEN));
if(testPz.getStatus() == TestColor.GREEN);
public int getDeliveryTimeInDays() {
switch (status) {
case ORDERED:
return 5;
case READY:
return 2;
case DELIVERED:
return 0;
}
return 0;
}