枚举
1. 什么是枚举
- 枚举是一个特殊的JavaBean类,这个类的对象是有限个;
- 使用场景: 订单的状态、月份、星期、游戏角色职业、会议室预约状态、设备状态...
2. 枚举的定义格式
标准的枚举示例:
public enum OrderState {
PAYMENT_PENDING("待支付"),
PROCESSING("处理中"),
SHIPPED("已发货"),
OUT_FOR_DELIVERY("已出库"),
DELIVERED("已送达"),
CANCELLED("已取消");
private final String name;
private OrderState(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
- 首先public后的class被换成了enum
- 红字所代表的是枚举项,后面的括号中代表了他所对应的私有化成员变量name的值
- 在创建对象的时候都采用了有参构造(枚举项),所以就不需要空参构造了;
- 下为有参构造的例子: 写private的原因是不让外界创建对象,换成public与枚举这一概念相矛盾;
private OrderState(String name) {
this.name = name;
}//有参构造
- 去除setName方法,不需要修改属性值;
所对应的测试类:
public class EnumTest1 {
public static void main(String[] args) {
OrderState o1 = OrderState.PAYMENT_PENDING;
System.out.println(o1.getName());
switch (o1) {
case PAYMENT_PENDING:
System.out.println("待支付");
break;
case PROCESSING:
System.out.println("处理中");
break;
case SHIPPED:
System.out.println("已发货");
break;
case OUT_FOR_DELIVERY:
System.out.println("已出库");
break;
case DELIVERED:
System.out.println("已送达");
break;
case CANCELLED:
System.out.println("已取消");
break;
}
}
}
- 直接使用枚举类名.枚举项调用即可;
OrderState o1 = OrderState.PAYMENT_PENDING;
输出结果:
3.枚举的注意事项
- 每一个枚举项,都是该枚举类的对象;
- 枚举项在底层就是常量,默认用public static final修饰(虚拟机自动修饰);
- 枚举类的第一行上必须是枚举项,枚举项之间用逗号隔开,以分号为结尾;
- 枚举类的构造方法必须是private修饰(虚拟机自动补充),不让外界创建本类的对象;
- 编辑器会给枚举类新增两个默认存在的方法:values(),valueOf();
(1)每一个枚举项,都是该枚举类的对象**;**
private OrderState(String name) {
sout(”看看我执行了吗“ + name);
this.name = name;
}//有参构造
运行时控制台输出:
- 这证明在运行OrderState时,是通过构造方法把枚举项创建、以供使用;
(5)编辑器会给枚举类新增两个默认存在的方法:values(),valueOf();
values():表示获取所有的枚举项;
public class EnumTest2 {
public static void main(String[] args) {
OrderState[] arr = OrderState.values();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i].getName());
}
}
}
输出结果:
ValueOf()表示获取一个指定的枚举项
OrderState o1 = OrderState.valueOf("PAYMENT_PENDING");
System.out.println(o1.getName());
输出结果为:待支付