1.为了让编译器能自动检查某个值在枚举的集合内,并且不同用途的枚举需要不同的类型来标记,不能混用,我们可以使用enum来定义枚举类。

    1. enum Weekday {
    2. SUN, MON, TUE, WED, THU, FRI, SAT;
    3. }

    2.枚举的好处

    • enum常量本身带有类型信息,即Weekday.SUN类型是Weekday,编译器会自动检查出类型错误。
    • 不可能引用到非枚举的值,因为无法通过编译。
    • 不同类型的枚举不能互相比较或者赋值,因为类型不符。

    3.enum的比较
    使用enum定义的枚举类是一种引用类型,但enum类型的每个常量在JVM中只有一个唯一实例,可以例外,所以可以直接用==比较。

    if (day == Weekday.FRI) { // ok!
    }
    if (day.equals(Weekday.SUN)) { // ok, but more code!
    }
    

    4.enum类型
    enum定义的类型就是class,只不过它有以下几个特点:

    • 定义的enum类型总是继承自java.lang.Enum,且无法被继承;
    • 只能定义enum的实例,而无法通过new操作符创建enum的实例;
    • 定义的每个实例都是引用类型的唯一实例;
    • 可以将enum类型用于switch语句。

    5.enum实例方法

    • name()
      String s = Weekday.SUN.name(); // “SUN”
    • ordinal()
      int n = Weekday.MON.ordinal(); // 1

    6.switch
    枚举类可以应用在switch语句中。因为枚举类天生具有类型信息和有限个枚举常量,所以比int、String类型更适合用在switch语句中。

    public class Main {
        public static void main(String[] args) {
            Weekday day = Weekday.SUN;
            switch(day) {
            case MON:
            case TUE:
            case WED:
            case THU:
            case FRI:
                System.out.println("Today is " + day + ". Work at office!");
                break;
            case SAT:
            case SUN:
                System.out.println("Today is " + day + ". Work at home!");
                break;
            default:
                throw new RuntimeException("cannot process " + day);
            }
        }
    }
    enum Weekday {
        MON, TUE, WED, THU, FRI, SAT, SUN;
    }