Java 枚举简介

枚举用于表示某个类型由限定个数的实例, 使用关键字 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;
        }
    }

Java 枚举简介
枚举使用场景

把一些状态值维护到枚举类中, 便于管理
增强代码可读性和可维护性

推荐在编写代码时, 如果用到状态值相关的, 统一维护到枚举类中

上一篇:BigTable论文翻译


下一篇:uva340-Master-Mind Hints