Use Of Enumerations - 枚举的使用 - Java - 细节狂魔

x33g5p2x  于2022-03-01 转载在 Java  
字(1.2k)|赞(0)|评价(0)|浏览(329)

枚举的背景及定义

枚举是在JDK1.5以后引入的。
主要用途是:将一组常量组织起来。
在这之前表示一组常量通常使用定义常量的方式:

public static int final RED = 1;
public static int final GREEN = 2;
public static int final BLACK = 3;

但是常量举例有不好的地方,例如:可能碰巧有个数字1,但是它有可能误会是 RED.
现在我们可以直接用枚举来进行组织,这样一来,就拥有了类型,枚举类型。而不是普通的整形1。

public enum TestEnum {
  RED,BLACK,GREEN;
}

优点

将常量组织起来统一进行管理

场景

错误状态码,消息类型,颜色的划分,状态机等等。。。。。。。

本质:

是 java.lang.Enum 的子类也就是说,它自己写的枚举类,就算没有显示的继承 Enum,但是其默认继承了 这个类。

枚举类的创建

实践

调用枚举中的量

switch 语句

枚举类的常用方法

方法名称描述
values()以数组形式返回枚举类型的所有成员
ordinal()获取枚举成员的索引位置
valueOf()将普通字符串转换为枚举实例
compareTo()比较两个枚举成员在定义时的顺序

values方法 - 以数组形式返回枚举类型的所有成员

ordinal 方法 - 获取枚举成员的索引位置

拓展

最直接的方法就是查阅JDK的文档了,oracle在线文档的地址在这里:链接
找到这个部分

也就是说 之所以我们咋 enum 类中,看不到 values 方法 ,是因为 它是编译器在程序运行起来的时候,创建 Enum 类时,会自动添加一些特殊方法,其中就包括 values 方法。
现在明白了吧! values 竟然隐藏的如此深,真的牛皮。

valueOf() - 将普通字符串转换为枚举实例

目前个人觉得这个功能很鸡助。。

compareTo() - 比较两个枚举成员在定义时的顺序

枚举对象

枚举优缺点

优点:

  1. 枚举常量更简单安全 。
  2. 枚举具有内置方法 ,代码更优雅

缺点:

  1. 不可继承,无法扩展,【从构造的方法的私有性就能看出来】

枚举和反射

枚举是否可以通过反射,拿到实例对象呢? -这道题是2017年阿里巴巴曾经问到的一个问题


上篇博文反射说到:任何一个类,哪怕其构造方法是私有的,我们也可以通过反射拿到它的实例对象,那么枚举的构造方法也是私有的,我们是否可以拿到呢?接下来,我们来实验一下:

关于继承的问题,不明白的可以参考这篇文章ObjectOrientedProgramming - 面向对象的编程

由此引出一个面试题:如何实现一个线程安全的单例模式【只能获取一个实例】

可以看看这个文章单例模式简介,我最后的那个单例模式的代码就是这里拿的。

总结

1、枚举 将常量组织起来统一进行管理,更简单安全。
2、枚举本身就是一个类,其构造方法默认为私有的,且都是默认继承于 java.lang.Enum
2、 枚举可以避免反射和序列化问题:枚举类非常安全!
4、不可继承,无法扩展。
5、枚举具有内置方法 ,代码更优雅

相关文章