Enum01_都有常量了为何要有枚举类

发布时间 2023-06-08 09:18:25作者: Purearc

​ 我们在不引入 ENUM 的情况下使用 Integer (String 啥的肯定也可以)定义四个不同的季节,由于这个是 static 和 final 的,肯定是能通过类 OGNL 直接调用且不能被改变的。

public class Season {
    /**
     * 使用 Integer 来定义春夏秋冬(其他类型是自然可以)
     */
    public static final int SPRING = 1;
    public static final int SUMMER = 2;
    public static final int AUTUMN = 3;
    public static final int WINTER = 4;
    /**
     * 定义静态常量可以在其它类中直接通过类名 OGNL 语句调用
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
        System.out.println(Season.SUMMER);
        System.out.println(Season.AUTUMN);
        System.out.println(Season.WINTER);
    }

    

​ 如果我们根据 Season 的值来区分不同的逻辑,假设为 方法 fun(),参数为 int 类型,但是我们用的时候只要传入一个 INT 值就可以了,当然你也可以写上范围,或者进行逻辑判断,但是对于使用者就不是很友好。

	/**
     *
     * @param season
     * 只要传递int就可以
     */
//可能出现的情况

	fun(Season.Spring);
	fun(3);
    fun(4);
    fun(100);

    public static void fun(int season) {
        switch (season) {
            case 1:
                System.out.println(1);
                break;
            case 2:
                System.out.println(2);
                break;
            case 3:
                System.out.println(3);
                break;
            default:
                System.out.println(4);
        }
    }
}

​ 如果对于 Season 类,我们里面的成员都改成 Season 类型的,并且把类加上 final 修饰(防止继承),把构造器写成 private 的(防止外部实例化),然后在将 fun() 函数的参数改为 Season 类型的 ,这样就可以限制我在使用这个方法的时候只能传入 Season 类型,而且我这个类还是写死的,也不能 new 对象,我里面写了什么你就只能用什么,直接就在根源限制了你要传入的参数,况且 IDE 会给你提醒你要传入个什么东西。

public final class Season2 {
    /**
     * 保证季节类型只会有这些常量
     */
    public static final Season2 SPRING = new Season2();
    public static final Season2 SUMMER = new Season2();
    public static final Season2 AUTUMN = new Season2();
    public static final Season2 WINTER = new Season2();

    private Season(){}

    public static void fun2(Season2 season){
        //方法体
    }

    public static void main(String[] args) {
        fun2(Season2.AUTUMN);
        fun2("SPRING");
    }
}

​ 下面是改造过后的

image-20230602213305981

​ 这就是 ENUM 的设计原理,下面代码通过 javap 后得到的与我们的 Season2 基本一致,且 ENUM 本身就是一个类,所以限制了传入类型,但是我们只能通过 enum 关键字让我们的自定义枚举继承 ENUM 类,这是 java 的规范。

public enum SeasonEnum {
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER
}

image-20230602213617568