Java基础-枚举类enum

278 阅读1分钟

枚举类介绍

把同一维度的有限的状态集合放到一个类中,比如开发中订单的几种状态(生成订单、待付款、付款成功、取消订单等)、商品的分类(畅销、一般、滞销)等。

开发用法

枚举类enum有两个内部属性:

  1. private final String name:代表枚举常量的名称,通过name()方法获得值;
  2. private final int ordinal:代表枚举常量在枚举类中的次序,通过ordinal()方法获得值;

枚举类enum有几个常用的方法:

  1. WeekDay.ValueOf(String name):返回和name值完全相同的枚举变量;
  2. 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;
        }
    }

抛出一些问题

  1. 为什么在枚举类中定义变量?因为假如我们在中间位置新增枚举常量时,后面的枚举常量的ordianl值会改变;
  2. 为什么构造静态方法of?因为我们一般先是获得一个int day,然后想根据day做switch,switch的case中用枚举常量,结果造成类型不匹配,很是尴尬。
  WeekDay weekDay = WeekDay.of(xxx.getDay());
  switch(weekDay){
      case SUN:
          ...
          break;
      case MON:
          ...
          break;
      ...
      default: break;
  }

内部原理

小小的枚举类,涨知识了!

枚举类和常量类的区别

枚举类的内部原理