0
点赞
收藏
分享

微信扫一扫

Java枚举类型

天天天蓝loveyou 2022-04-19 阅读 89
java

前言

回想单例设计模式:单例类是一个类只有一个实例,那么多例类就是一个类有多个实例,但不是无限个数的实例,而是有限个数的实例,这才能是枚举类。 枚举类是把变量的值一一列出来,变量的值只限于列举出来的值的范围内。

 

枚举类型

1、在Java中,被 enum 关键字修饰的类型就是枚举类型,enum 的全称为 enumeration,它是 JDK 1.5 中引入的新特性。所有的枚举类型都是继承自Enum 类型。 

2、它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,因此这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。

3、枚举一般用于以下情况:定义常量、添加新方法、与switch结合使用、实现接口、使用接口组织枚举。

下面使用枚举定义常量,并对比未使用枚举定义常量的区别,同时介绍枚举的基本原理。

应用一:定义常量

案例:未使用枚举类型定义常量

   我们通常利用public final static 方法定义的代码如下,分别用1-6表示星期一到星期日

问题:上述的常量定义常量的方式称为int枚举模式,这样的定义方式在类型安全和使用方便性上有不足之处,如果存在定义int值相同的变量,混淆的几率很大,编译器也不会提出任何警告。
解决方案:使用枚举类型
      枚举类型现后上述int枚举模式并不提倡,相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法,现在我们利用枚举类型来重新定义上述的常量。

案例:使用枚举类型之后定义常量

进行测试:

通过案例可以看出,使用枚举的结果本质上底层调用了EnumWeekDay默认构造方法,创建了多个EnumWeekDay实例对象,对象起名分别为MONDAY到SUNDAY,将枚举数据实例存入一个数组的里面,ordinal是数组的下标。(后面原理部分会讲)

案例:使用枚举的有参构造

步骤:

  1. 先定义枚举实例序列,枚举实例后的括号,表示调用私有构造方法;
  2. 必须在enum实例序列的最后添加一个分号;
  3. 创建私有变量;
  4. 编写私有有参构造方法;
  5. 覆盖toString()方法

底层原理

实际上在使用关键字enum创建枚举类型并编译后,编译器会为我们生成一个相关的类,
这个类继承了Java API中的java.lang.Enum类。以上面案例为例:使用javac进行编译EnumWeekDay.java:javac EnumWeekDay.java,生成EnumWeekDay.class,对EnumWeekDay.class反编译如下:

再进一步分析:

       从反编译的代码看出,EnumWeekDay类(注意该类是final类型的,将无法被继承)继承自java.lang.Enum类,同时编译器还帮助我们生成了7个EnumWeekDay类型的实例对象分别对应枚举中定义的7个日期,充分说明了使用关键字enum定义的EnumWeekDay类型中的每种日期枚举常量也是实实在在的EnumWeekDay实例对象。其中同时values()方法的作用就是获取枚举类中的所有变量,并作为数组返回,valueOf()根据参数获取1个对应枚举变量,测试用例如下:

应用二:添加新方法

步骤:

  1. 先定义枚举实例序列,枚举实例后的括号,表示调用私有构造方法;
  2. 必须在enum实例序列的最后添加一个分号;
  3. 创建私有变量;
  4. 编写私有有参构造方法;
  5. 添加新方法;
  6. 覆盖toString()方法。

应用三:与switch结合使用

应用四:实现接口

应用五:使用接口组织枚举



 

举报

相关推荐

0 条评论