枚举用于表示某个类型由限定个数的实例, 使用关键字 enum
枚举与类有类似的地方
类可以无限制的 new, 即无限制的实例化类为对象
而枚举是内置固定数量的已经实例化完成的对象, 我们直接使用即可
枚举的构造方法固定是 private
这里举例
public enum OrderStatusEnum {
// 类似于类实例化 (调用构造方法), 要与我们构造方法的形参列表对应才行
// 每个对象都是单例的, 不会有两个一样的枚举
NEW(1, "新订单"),
PAID(2, "已支付"),
// 这里末尾多了一个逗号是正常的, java 中对于数组 / 枚举最后一个元素多了 1 个逗号, 编译器会自动忽略 (这样方便我们修改追加新的枚举元素)
CANCEL(3, "已取消"),
;
// 属性推荐设置为 final, 因为枚举本身的意义是有限的不可变对象
private final Integer code;
private final String desc;
// 构造方法固定是 private 无需显式声明
// 要与上面的枚举对象中传入的参数列表一致
OrderStatusEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
// 增加 get 方法, 便于获取枚举中属性的值
// 这里没有 set 方法, 因为这就违背了枚举的意义
public Integer getCode() {
return code;
}
public String getDesc() {
return desc;
}
}
该枚举一共 2 个属性 code
, desc
NEW(1, "新订单")
, 就表示 1 code
, "新订单" desc
的值
枚举的含义就是有限定个数的实例对象, 所以属性推荐设置为 final
, 即表示不可变属性 (推荐, 不过非强制)
需要使用这两个属性创建构造方法 (固定是 private
, 无需再显式声明)
使用
枚举的使用
/**
* 枚举使用 == 或者 equals 比较都是可以的
*/
@Test
public void testEquals() {
// 使用枚举时, 可以安全地使用 == (因为枚举都是单例的)
OrderStatusEnum orderStatusEnumNew1 = OrderStatusEnum.NEW;
OrderStatusEnum orderStatusEnumNew2 = OrderStatusEnum.NEW;
assertTrue(orderStatusEnumNew1 == orderStatusEnumNew2);
// 或者使用 equals (Enum 类重写了该方法)
assertTrue(orderStatusEnumNew1.equals(orderStatusEnumNew2));
}
枚举用于 switch 中
/**
* enum switch
*/
@Test
public void testSwitch() {
OrderStatusEnum orderStatusEnumNew = OrderStatusEnum.NEW;
switch (orderStatusEnumNew) {
// 枚举作为 switch 参数时, 比较的实际上是 ordinal() 该元素所在枚举中的位置 (0 开始)
// case 中直接写枚举值 xxx, 无需再加枚举类 OrderStatusEnum
case NEW:
System.out.println(orderStatusEnumNew);
break;
case PAID:
System.out.println(orderStatusEnumNew);
break;
case CANCEL:
System.out.println(orderStatusEnumNew);
break;
default:
System.out.println(orderStatusEnumNew);
break;
}
}
枚举使用场景
把一些状态值维护到枚举类中, 便于管理
增强代码可读性和可维护性
推荐在编写代码时, 如果用到状态值相关的, 统一维护到枚举类中