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

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

copy
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 值就可以了,当然你也可以写上范围,或者进行逻辑判断,但是对于使用者就不是很友好。

copy
/** * * @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 会给你提醒你要传入个什么东西。

copy
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 的规范。

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

image-20230602213617568

posted @   Purearc  阅读(15)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
🚀