枚举类介绍
把同一维度的有限的状态集合放到一个类中,比如开发中订单的几种状态(生成订单、待付款、付款成功、取消订单等)、商品的分类(畅销、一般、滞销)等。
开发用法
枚举类enum有两个内部属性:
- private final String name:代表枚举常量的名称,通过name()方法获得值;
- private final int ordinal:代表枚举常量在枚举类中的次序,通过ordinal()方法获得值;
枚举类enum有几个常用的方法:
- WeekDay.ValueOf(String name):返回和name值完全相同的枚举变量;
- WeekDay.values():返回包括所有枚举变量的数组,[常用];
public enum WeekDay {
SUN(0, "星期日"),
MON(1, "星期一"),
TUE(2, "星期二"),
WED(3, "星期三"),
THU(4, "星期四"),
FRI(5, "星期五"),
SAT(6, "星期六");
private final int value;
private final String desc;
WeekDay(int value, String desc) {
this.value = value;
this.desc = desc;
}
public int getValue() {
return this.value;
}
public static WeekDay of(int value) {
for (WeekDay weekDay : values()) {
if (weekDay.value == value) {
return weekDay;
}
}
// throw new IllegalArgumentException("传入的星期天数不合法!")
// 经大佬指点,这里返回null比较合适,根据返回值进行判断是否为空,选择抛异常还是吃掉异常
return null;
}
}
抛出一些问题
- 为什么在枚举类中定义变量?因为假如我们在中间位置新增枚举常量时,后面的枚举常量的ordianl值会改变;
- 为什么构造静态方法of?因为我们一般先是获得一个int day,然后想根据day做switch,switch的case中用枚举常量,结果造成类型不匹配,很是尴尬。
WeekDay weekDay = WeekDay.of(xxx.getDay());
switch(weekDay){
case SUN:
...
break;
case MON:
...
break;
...
default: break;
}
内部原理
小小的枚举类,涨知识了!