• 对于数量有限的对象,应该优先考虑使用枚举类型
  • 好处:类型安全,业务明确

# 定义格式

public enum Weekday {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

public enum Gender {
    // 此处的枚举值必须调用对应构造器来创建
    MALE("男")
    // 花括号部分实际上是一个类体部分
    {
        // 每个枚举值提供不同的实现方式
        public void info()
        {
            System.out.println("这个枚举值代表男性");
        }
    },
    FEMALE("女")
    {
        public void info()
        {
            System.out.println("这个枚举值代表女性");
        }
    };
    private final String name;
    
    // 枚举类的构造器只能使用private修饰
    private Gender(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void info() {
        System.out.println("这是一个用于定义性别的枚举类");
    }
}

// main...
System.out.println(Gender.MALE); // MALE
System.out.println(Gender.MALE.getName()); // 男
Gender.MALE.info(); // 这个枚举值代表男性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

枚举类中的属性字段应该定义为私有的,最好加上 final 修饰符,没有对应的 setter 方法,只能在私有构造函数中赋值

# 特点

  • 是一种特殊的类,可以定义构造器、成员变量、普通方法和抽象方法
  • 枚举类隐式继承了 java.lang.Enum 类,但不能显式继承其它父类
  • 其构造器默认使用 private 修饰,一旦为枚举类显式定义了带参数的构造器,列出枚举值时就必须对应地传入参数
  • 枚举类的所有实例必须在枚举类的第一行显式列出;列出这些实例时,系统会默认使用 public static final 修饰(全局静态常量);枚举值列举结束后以 ; 作为结束
  • 枚举实例后有花括号时,该枚举实例是枚举类匿名内部子类的对象

# 使用

  1. 使用该枚举类的某个实例:EnumClass.variable

    Weekday day = Weekday.SATURDAY;
    
    1
  2. Enum 类中的实例方法

    • String name()String toString():返回该枚举实例的常量名称
    • int ordinal():返回该枚举值在枚举类中的索引,从 0 开始
    • boolean equals(Object other):当指定对象等于此枚举常量时,返回 true
  3. 枚举类默认提供的类方法(从反编译代码中)

    // 枚举类型[] values():返回该枚举类所有枚举对象组成的数组
    Weekday[] ws = Weekday.values();
    
    // 枚举类型 valueOf(String name):返回名称为 name 的枚举对象
    Weekday day = Weekday.valueOf("MONDAY");
    
    1
    2
    3
    4
    5
  4. switch 也支持操作枚举类型

    • switch 的控制表达式可以是枚举类型变量;case 表达式中的值直接使用枚举值的名字,即无须添加枚举类作为限定
    • 底层调用枚举对象的 ordinal() 方法,而该方法的返回值类型是 int 类型
  5. 使用枚举做单例模式

Updated at: 2022-07-15 15:27:12