1. 定义枚举类

当类的对象只有有限个、确定的时,建议使用枚举类。比如:

  1. 星期:Monday、、Sunday;
  2. 季节:Spring、、Winter;
  3. 线程状态:创建、就绪、运行、阻塞、死亡;

使用enum关键字来自定义枚举类

  1. public enum Season {
  2. // 1.提供当前枚举类的对象,逗号隔开, 默认private static final
  3. SPRING("春天","春暖花开"),
  4. SUMMER("夏天","夏日炎炎"),
  5. AUTUMN("秋天","秋高气爽"),
  6. WINTER("冬天","冰天雪地");
  7. // 2.声明Season对象的属性, prviate final 修饰
  8. private final String seasonName;
  9. private final String seasonDesc;
  10. // 3. 构造器,默认private
  11. Season(String seasonName, String seasonDesc) {
  12. this.seasonName = seasonName;
  13. this.seasonDesc = seasonDesc;
  14. }
  15. // 4. 其他诉求
  16. @Override
  17. public String toString() {
  18. return "Season{" +
  19. "seasonName='" + seasonName + '\'' +
  20. ", seasonDesc='" + seasonDesc + '\'' +
  21. '}';
  22. }
  23. }

然后就可以直接调用Season类中的常量对象:

  1. public class Test {
  2. public static void main(String[] args) {
  3. Season spring = Season.SPRING;
  4. System.out.println(spring);
  5. }
  6. }

image.png

【注意点】

  • 枚举类中对象的声明一定要写在最前面
  • 对象之间用逗号隔开,最后一个对象后加分号
  • 枚举类的对象默认且只能为 private static final,并且不允许另加修饰符
  • 枚举类的属性可以自定以修饰符,但是最好用prviate final修饰
  • 枚举类的构造器默认且只能为prviate,不能用public修饰

2. Enum类的主要方法

枚举类的直接父类不是Object,而是Enum
image.png

Enum类主要有以下几个方法供使用:

方法名 详细描述
values 返回枚举类型的对象数组。该方法可以很方便地遍历所有枚举常量
valueOf 传递枚举类型的Class对象和枚举常量名称给静态方法valueOf,会得到与参数匹配的枚举常量。说白了就是由名字返回枚举常量,如果不存在则返回异常
toString 得到当前枚举常量的名称,仅此而言,一般会重写
equals 在枚举类中可以直接使用==来比较两个枚举常量是否相等。Enum提供的这个equals方法,也是直接使用==来实现的。它的存在是为了在Set、List和Map中使用。注意,它是不可变的
hashCode Enum实现了hashCode()来和equals()保持一致,它也是不可变的
getDeclaringClass 得到枚举常量所属枚举类型的Class对象。可以用它来判断两个枚举常量是否属于同一个枚举类型
name 得到当前枚举常量的名称
ordinal 得到当前枚举常量的次序
compareTo 枚举类型实现了Comparable接口,这样可以比较两个枚举常量的大小
clone 枚举类不能被Clone。为了防止子类实现克隆方法,Enum实现了一个仅抛出CloneNotSupportedException 异常的不变 Clone()

3. 实现接口的枚举类

枚举类实现接口和普通class实现接口的格式差不多,都是实现其中的方法:

  1. public enum Season implements Info {
  2. // 1.提供当前枚举类的对象,逗号隔开, 默认private static final
  3. SPRING("春天","春暖花开"),
  4. SUMMER("夏天","夏日炎炎"),
  5. AUTUMN("秋天","秋高气爽"),
  6. WINTER("冬天","冰天雪地");
  7. // 2.声明Season对象的属性, prviate final 修饰
  8. private final String seasonName;
  9. private final String seasonDesc;
  10. // 3. 构造器,默认private
  11. Season(String seasonName, String seasonDesc) {
  12. this.seasonName = seasonName;
  13. this.seasonDesc = seasonDesc;
  14. }
  15. @Override
  16. public void show() {
  17. System.out.println("这是个季节枚举类");
  18. }
  19. }
  1. 但是,这样的话,每个枚举常量实现的方法体都是一样的,这样的话枚举就没有意义了。因此,枚举类支持对每个枚举常量单独继续接口实现,每个枚举常量的方法体可以不同
public enum Season implements Info {
    // 1.提供当前枚举类的对象,逗号隔开,  默认private static final
    SPRING("春天","春暖花开")
    {
        @Override
        public void show() {
            System.out.println("这是春天");
        }
    },
    SUMMER("夏天","夏日炎炎"){
        @Override
        public void show() {
            System.out.println("这是夏天");
        }
    },
    AUTUMN("秋天","秋高气爽"){
        @Override
        public void show() {
            System.out.println("这是秋天");
        }
    },
    WINTER("冬天","冰天雪地"){
        @Override
        public void show() {
            System.out.println("这是冬天");
        }
    };

    // 2.声明Season对象的属性, prviate final 修饰
    private final String seasonName;
    private final String seasonDesc;

    // 3. 构造器,默认private
    Season(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

}