好处

  • 类型安全,业务明确

定义格式

  1. public enum Weekday {
  2. MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
  3. }
  4. public enum Gender {
  5. // 此处的枚举值必须调用对应构造器来创建
  6. MALE("男")
  7. // 花括号部分实际上是一个类体部分
  8. {
  9. // 每个枚举值提供不同的实现方式
  10. public void info()
  11. {
  12. System.out.println("这个枚举值代表男性");
  13. }
  14. },
  15. FEMALE("女")
  16. {
  17. public void info()
  18. {
  19. System.out.println("这个枚举值代表女性");
  20. }
  21. };
  22. private final String name;
  23. // 枚举类的构造器只能使用private修饰
  24. private Gender(String name) {
  25. this.name = name;
  26. }
  27. public String getName() {
  28. return this.name;
  29. }
  30. public void info() {
  31. System.out.println("这是一个用于定义性别的枚举类");
  32. }
  33. }
  34. // main...
  35. System.out.println(Gender.MALE); // MALE
  36. System.out.println(Gender.MALE.getName()); // 男
  37. Gender.MALE.info(); // 这个枚举值代表男性

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


特点

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

使用

  • 使用该枚举类的某个实例:EnumClass.variable
  1. Weekday day = Weekday.SATURDAY;
  • Enum 类中的实例方法

    • String name():返回该枚举实例的常量名称
    • int ordinal():返回该枚举值在枚举类中的索引,从 0 开始
    • String toString():返回该枚举实例的常量名称
    • boolean equals(Object other) :当指定对象等于此枚举常量时,返回 true
  • 枚举类默认提供的类方法(从反编译代码中)
  1. // 枚举类型[] values():返回该枚举类所有枚举对象组成的数组
  2. Weekday[] ws = Weekday.values();
  3. // 枚举类型 valueOf(String name):返回名称为 name 的枚举对象
  4. Weekday day = Weekday.valueOf("MONDAY");
  • switch 也支持操作枚举类型

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