• 自动拆装箱
  • 泛型
  • 可变参数
  • 静态导入
  • 增强for循环
  • 互斥锁
  • 枚举

枚举

枚举概述

是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。例:一周只有7天,一年只有12个月等。

回想单例设计模式:单例类是一个类只有一个实例. 那么多例类就是一个类有多个实例,但不是无限个数的实例,而是有限个数的实例,这才能是枚举类。

手动实现枚举

实现无参构造枚举

  1. class MonthEnum{
  2. /**
  3. * 私有构造,不让外部创建实例
  4. */
  5. private MonthEnum(){
  6. }
  7. /**一月*/
  8. public static final MonthEnum month_1 = new MonthEnum();
  9. /**二月*/
  10. public static final MonthEnum month_2 = new MonthEnum();
  11. /**三月*/
  12. public static final MonthEnum month_3 = new MonthEnum();
  13. }

实现有参构造的枚举

  1. class MonthEnum2{
  2. private String name;
  3. public MonthEnum2(String name){
  4. this.name = name;
  5. }
  6. public static final MonthEnum2 month_1 = new MonthEnum2("一月");
  7. public static final MonthEnum2 month_2 = new MonthEnum2("二月");
  8. public static final MonthEnum2 month_3 = new MonthEnum2("三月");
  9. public String getName() {
  10. return name;
  11. }
  12. @Override
  13. public String toString() {
  14. return name;
  15. }
  16. }

使用抽象类实现枚举

  1. /**
  2. * 抽象类
  3. */
  4. abstract class MonthEnum3{
  5. private String name;
  6. public MonthEnum3(String name){
  7. this.name = name;
  8. }
  9. /**
  10. * 添加抽象方法
  11. */
  12. public abstract void show();
  13. public static final MonthEnum3 month_1 = new MonthEnum3("一月"){
  14. @Override
  15. public void show() {
  16. System.out.println("show 一月");
  17. }
  18. };
  19. public static final MonthEnum3 month_2 = new MonthEnum3("二月"){
  20. @Override
  21. public void show() {
  22. System.out.println("show 二月");
  23. }
  24. };
  25. public static final MonthEnum3 month_3 = new MonthEnum3("三月"){
  26. @Override
  27. public void show() {
  28. System.out.println("show 三月");
  29. }
  30. };
  31. public String getName() {
  32. return name;
  33. }
  34. @Override
  35. public String toString() {
  36. return name;
  37. }
  38. }

测试枚举类

  1. /**
  2. * 实现无参构造的枚举类测试
  3. */
  4. @Test
  5. public void demo1(){
  6. MonthEnum month_1 = MonthEnum.month_1;
  7. MonthEnum month_2 = MonthEnum.month_2;
  8. MonthEnum month_3 = MonthEnum.month_3;
  9. }
  10. /**
  11. * 实现有参构造的枚举类测试
  12. */
  13. @Test
  14. public void demo2(){
  15. MonthEnum2 month_1 = MonthEnum2.month_1;
  16. MonthEnum2 month_2 = MonthEnum2.month_2;
  17. MonthEnum2 month_3 = MonthEnum2.month_3;
  18. System.out.println(month_1);
  19. System.out.println(month_2);
  20. System.out.println(month_3);
  21. }
  22. /**
  23. * 使用抽象类
  24. */
  25. @Test
  26. public void demo3(){
  27. MonthEnum3 month_1 = MonthEnum3.month_1;
  28. MonthEnum3 month_2 = MonthEnum3.month_2;
  29. MonthEnum3 month_3 = MonthEnum3.month_3;
  30. month_1.show();
  31. month_2.show();
  32. month_3.show();
  33. System.out.println("=================");
  34. System.out.println(month_1);
  35. System.out.println(month_2);
  36. System.out.println(month_3);
  37. }

通过enum关键字实现枚举

无参构造枚举

  1. /**
  2. * 定义枚举类要用关键字enum
  3. */
  4. enum Week{
  5. /**
  6. * 枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略
  7. */
  8. MON,TUE,WED;
  9. }

有参构造枚举

  1. /**
  2. * 枚举类可以有构造器,但必须是private的,它默认的也是private的。
  3. */
  4. enum Week2{
  5. MON("星期一"),TUE("星期二"),WED("星期三");
  6. private String name;
  7. private Week2(String name){
  8. this.name = name;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. }

抽象方法枚举

  1. /**
  2. * 枚举类也可以有抽象方法,但是枚举项必须重写该方法
  3. */
  4. enum Week3{
  5. MON("星期一"){
  6. @Override
  7. public void show() {
  8. System.out.println("show 星期一");
  9. }
  10. },TUE("星期二"){
  11. @Override
  12. public void show() {
  13. System.out.println("show 星期二");
  14. }
  15. },WED("星期三"){
  16. @Override
  17. public void show() {
  18. System.out.println("show 星期三");
  19. }
  20. };
  21. public abstract void show();
  22. private String name;
  23. private Week3(String name){
  24. this.name = name;
  25. }
  26. public String getName() {
  27. return name;
  28. }
  29. }

测试枚举类

/**
     * 测试无参构造的枚举类
     */
    @Test
    public void demo1(){
        Week mon = Week.MON;
        Week tue = Week.TUE;
        Week wed = Week.WED;
        System.out.println(mon);
        System.out.println(tue);
        System.out.println(wed);
    }


    /**
     * 测试带参构造的枚举类
     */
    @Test
    public void demo2(){
        Week2 mon = Week2.MON;
        Week2 tue = Week2.TUE;
        Week2 wed = Week2.WED;
        System.out.println(mon.getName());
        System.out.println(tue.getName());
        System.out.println(wed.getName());
    }


    /**
     *带抽象方法的枚举类
     */
    @Test
    public void demo3(){
        Week3 mon = Week3.MON;
        Week3 tue = Week3.TUE;
        Week3 wed = Week3.WED;

        mon.show();
        tue.show();
        wed.show();
        System.out.println("===================");
        System.out.println(mon.getName());
        System.out.println(tue.getName());
        System.out.println(wed.getName());
    }

枚举在switch语句中的使用

switch可接收哪些类型?

  • 基本类型:byte short int char
  • 1.5版本起可以接收enum
  • 1.7版本起可以接收string

      @Test
      public void demo4(){
          Week mon = Week.TUE;
          switch (mon){
              case MON:
                  System.out.println("星期一");
              break;
              case TUE:
                  System.out.println("星期二");
                  break;
              case WED:
                  System.out.println("星期三");
                  break;
              default:
                  System.out.println("其他");
                  break;
          }
    
      }
    

    枚举的注意事项

  • 定义枚举类要用关键字enum

  • 所有枚举类都是Enum的子类
  • 枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略
  • 枚举类可以有构造器,但必须是private的,它默认的也是private的。
  • 枚举类也可以有抽象方法,但是枚举项必须重写该方法

枚举类的常见方法

  • int ordinal()
  • int compareTo(E o)
  • String name()
  • String toString()
  • T valueOf(Class type,String name)
  • values() 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便

    enum MyEnum{
     Value1("Value1"),
     Value2("Value2"),
     Value3("Value3");
    
     private String name;
     private MyEnum(String name){
         this.name = name;
     }
    
     public String getName() {
         return name;
     }
    
     @Override
     public String toString() {
         return "MyEnum{" +
                 "name='" + name + '\'' +
                 '}';
     }
    }
    

    ```java public class Demo03Enum {

/**
 * 枚举类的常见方法
 *  int ordinal()
 */
@Test
public void demo1(){
    MyEnum value1 = MyEnum.Value1;
    MyEnum value2 = MyEnum.Value2;
    MyEnum value3 = MyEnum.Value3;

    /**
     *  获取实例名称
     */
    System.out.println("获取实例名称:");
    System.out.println(value1.getName());
    //调用重写之后的toString
    System.out.println(value1.toString());


    /**
     * 枚举项都是有编号的
     */
    System.out.println("枚举项都是有编号的:");
    System.out.println(value1.ordinal());//0
    System.out.println(value2.ordinal());//1
    System.out.println(value3.ordinal());//2



    /**
     * 枚举项比较的都是编号
     */
    System.out.println("枚举项比较的都是编号:");
    int i1 = value1.compareTo(value2);
    System.out.println(i1);
    int i2 = value1.compareTo(value3);
    System.out.println(i2);


}


/**
 * 通过字节码文件获取枚举项对象
 *  <T> T valueOf(Class<T> type,String name)
 */
@Test
public void demo2(){
    MyEnum value = MyEnum.valueOf(MyEnum.class, "Value2");

    System.out.println(value.toString());

    /**
     * 输出结果:
     *
     * MyEnum{name='Value2'}
     */
}


/**
 * 遍历枚举类所有枚举项
 * values()
 *  此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法。
 */
@Test
public void demo3(){
    MyEnum[] values = MyEnum.values();
    for (MyEnum value : values) {
        System.out.println(value);
    }

    /**
     * 输出结果:
     *
     * MyEnum{name='Value1'}
     * MyEnum{name='Value2'}
     * MyEnum{name='Value3'}
     */
}

} ```