java 枚举类型 Enum

  在现实社会中,有些类的实例对象是固定的。例如季节,只有春夏秋冬。如果你创建了一个season类,你当然有义务维护这个类的实例对象只能是春(SPRING)、夏(SUMMER)、秋(AUTUMN)、冬(WINTER)这四个。这个时候就体现出枚举类的作用了,java中枚举类型就是针对这样的场景需求所设计的。

/**
 * 枚举类的后缀建议为Enum,枚举类型的实例对象建议全大写(这样做符合JAVA的规范)
 */
public enum SeasonEnum{  
  SPRING,SUMMER,AUTUMN,WINTER
}

 让我们来看看怎么使用SeasonEnum这个枚举类。

public class Test{
   public static void main(String[] args) {
    String summer = SUMMER;
    //通过valueOf,获取SUMMER的枚举类型
    SeasonEnum season2 = SeasonEnum.valueOf(summer); 
    //直接初始化
    SeasonEnum season1 = SeasonEnum.SPRING; 
    switch (season1) {  
            case SPRING:  
                 System.out.println(“春天”); 
                 break;  
            case SUMMER:  
                 System.out.println(“夏天”); 
                 break;  
            case AUTUMN:  
                 System.out.println(“秋天”); 
                 break; 
            case WINTER:  
                 System.out.println(“冬天”); 
                 break; 
        }  
    }  
}

  创建SeasonEnum枚举类,在使用的时候利用switch语句进行匹配从而得到相应的输出值,这种做法很常见。如果只需要实现这样的功能,定义一个常量类也可以实现。那么就让我们更进一步来看看枚举类的作用,针对上面的例子,如果我们在很多场景下都要通过SeasonEnum的实例对象获取相对应的中文,每次都使用switch语句就显得代码冗余。我们这样设想一下,当我们创建SeasonEnum这个枚举类时,可不可以让SeasonEnum中的每一个实例对象都有一个getChinese()方法呢。答案是肯定的,而且这种做法在企业开发中很常见。

public enum SeasonEnum {
    //枚举类的实例对象必须在最前面先定义,而且必须每个实例对象都必须维护上chinese成员变量
    SPRING("春天"),SUMMER("夏天"),AUMUTN("秋天"),WINTER("冬天");
 
    private String chinese;
 
    //枚举类型的构造函数默认为private,因为枚举类型的初始化要在当前枚举类中完成。
    SeasonEnum (String chinese){
        this.chinese= chinese;
    }
 
    public String getChinese(){
        return chinese;
    }
}

  这样乍一看是不是有点像我们平时创建一般实体类一样。其实枚举类型可以看做我们平时新建.class差不多,只是枚举类限制了此类的实例对象。当然,枚举类可以有自己的成员变量和方法。上面的SeasonEnum 枚举类有了chinese这个成员变量,所以我们在定义实例对象时就要维护这个chinese成员变量。现在再来看看,我们是怎么使用这个枚举类简化我们的代码。

public class Test{
    public static void main(String[] args) {
    //直接初始化
    SeasonEnum season1 = SeasonEnum.SPRING; 
    //调用SeasonEnum枚举类的getChinese()方法获取SPRING的中文值
    System.out.println(season1.getChinese()); 
    
   }  
}

-------------------------------------------------------

枚举

注意:枚举是单例的,单例要保证私有化构造器。

1. 如何自定义枚举类
  1. 提供类的属性,声明为 private final
  2. 声明为 final 的属性,在构造器中初始化
  3. 通过公共方法(get)方法来调用属性
  4. 创建枚举类的对象:将类的对象声明 public static final

举例如下:

public class Season {

    //1. 提供类的属性,声明为 private final
    private final String seasonName;
    private final String seasonDesc;
    
    //2. 声明为 final 的属性,在构造器中初始化
    private Season (String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    
    //3. 通过公共的方法来调用属性
    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDesc() {
        return seasonDesc;
    }
    
    //4. 创建枚举类的对象:将类的对象声明 public static final
    public static final Season SPRING = new Season("spring", "春暖花开");
    public static final Season SUMMER = new Season("summer", "夏日炎炎");
    public static final Season AUTUMN = new Season("autumn", "秋高气爽");
    public static final Season WINTER = new Season("winter", "白雪皑皑");
    
    @Override
    public String toString() {
        return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]";
    }

    public void show() {
        System.out.println("这是一个季节");
    }
    
    public static void main(String[] args) {
        Season spring = Season.SPRING;
        System.out.println(spring);
        spring.show();
        System.out.println(spring.getSeasonName());
    }
}

                    

2. 如何使用 enum 关键字来定义枚举类

将对象放到最前面,并且不需要定义对象的其他属性。
使用 enum 类来定义枚举类,可以使用下述两种方法来返回值。

  1. values() 方法:返回所有值
  2. valueOf() 方法:返回指定对象的值(要求传入的形参name是枚举类对象的名字)
    否则,报 java.lang.IllegalArgumentException 异常

改造一下上述代码:

enum SeasonEnum {
    
    SPRING("spring", "春暖花开"),
    SUMMER("summer", "夏日炎炎"),
    AUTUMN("autumn", "秋高气爽"),
    WINTER("winter", "白雪皑皑");
    
    private final String seasonName;
    private final String seasonDesc;

    private SeasonEnum (String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDesc() {
        return seasonDesc;
    }
    
    @Override
    public String toString() {
        return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]";
    }

    public void show() {
        System.out.println("这是一个季节");
    }
    
    public static void main(String[] args) {
        SeasonEnum spring = SeasonEnum.SPRING;
        System.out.println(spring);
        spring.show();
        System.out.println(spring.getSeasonName());
        
        System.out.println("-------------------");
        
        // 1. values() 方法:返回所有值
        SeasonEnum[] seasons = SeasonEnum.values();
        for (int i = 0; i < seasons.length; i++) {
            System.out.println(seasons[i]);
        }
        
        System.out.println("-------------------");

        // 2. valueOf() 方法:返回指定对象的值(要求传入的形参name是枚举类对象的名字)
        // 否则,报 java.lang.IllegalArgumentException 异常
        String str = "SPRING";
        SeasonEnum sea = SeasonEnum.valueOf(str);
        System.out.println(sea);

    }
}

                 

3. 枚举类实现接口

可以让不同的枚举类的对象调用被重写的抽象方法,执行的效果不同。(相当于让每个对象重写抽象方法)

改造如下:

interface Info {
    void show();
}
enum SeasonEnumTest implements Info {
    SPRING("spring", "春暖花开"){
        public void show() {
            System.out.println("春天在哪里?");
        }
    },
    SUMMER("summer", "夏日炎炎"){
        public void show() {
            System.out.println("夏天在哪里?");
        }
    },
    AUTUMN("autumn", "秋高气爽"){
        public void show() {
            System.out.println("秋天在哪里?");
        }
    },
    WINTER("winter", "白雪皑皑"){
        public void show() {
            System.out.println("冬天在哪里?");
        }
    };
    
    private final String seasonName;
    private final String seasonDesc;

    private SeasonEnumTest(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDesc() {
        return seasonDesc;
    }
    
    @Override
    public String toString() {
        return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]";
    }

    public void show() {
        System.out.println("这是一个季节");
    }
    
    public static void main(String[] args) {
        SeasonEnumTest spring = SeasonEnumTest.SPRING;
        System.out.println(spring);
        spring.show();
        System.out.println(spring.getSeasonName());
        
        System.out.println("-------------------");
        
        // 1. values() 方法:返回所有值
        SeasonEnumTest[] seasons = SeasonEnumTest.values();
        for (int i=0; i<seasons.length;i++) {
            System.out.println(seasons[i]);
        }

        System.out.println("-------------------");
        // 2. valueOf() 方法:返回指定对象的值(要求传入的形参name是枚举类对象的名字)
        // 否则,报 java.lang.IllegalArgumentException 异常
        String str = "WINTER";
        SeasonEnumTest sea = SeasonEnumTest.valueOf(str);
        System.out.println(sea);
        sea.show();
    }
}

                    

出处:https://www.e-learn.cn/content/java/2584441

     https://blog.csdn.net/cauchy6317/article/details/82313088

原文地址:https://www.cnblogs.com/myseries/p/11542804.html