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

文章目录

  • 枚举的背景及定义
    • 优点
    • 场景
    • 本质:
  • 枚举类的创建
  • 实践
    • 调用枚举中的量
    • switch 语句
  • 枚举类的常用方法
    • values方法 - 以数组形式返回枚举类型的所有成员
    • ordinal 方法 - 获取枚举成员的索引位置
      • 拓展
    • valueOf() - 将普通字符串转换为枚举实例
    • compareTo() - 比较两个枚举成员在定义时的顺序
  • 枚举对象
  • 枚举优缺点
    • 优点:
    • 缺点:
  • 枚举和反射
    • 枚举是否可以通过反射,拿到实例对象呢? -这道题是2017年阿里巴巴曾经问到的一个问题
    • 由此引出一个面试题:如何实现一个线程安全的单例模式【只能获取一个实例】
  • 总结

枚举的背景及定义

枚举是在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,但是其默认继承了 这个类。


枚举类的创建

Use Of Enumerations - 枚举的使用 - Java - 细节狂魔_第1张图片
Use Of Enumerations - 枚举的使用 - Java - 细节狂魔_第2张图片


实践

调用枚举中的量

Use Of Enumerations - 枚举的使用 - Java - 细节狂魔_第3张图片


switch 语句

Use Of Enumerations - 枚举的使用 - Java - 细节狂魔_第4张图片


枚举类的常用方法

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

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

Use Of Enumerations - 枚举的使用 - Java - 细节狂魔_第5张图片


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

Use Of Enumerations - 枚举的使用 - Java - 细节狂魔_第6张图片


拓展

Use Of Enumerations - 枚举的使用 - Java - 细节狂魔_第7张图片

最直接的方法就是查阅JDK的文档了,oracle在线文档的地址在这里:链接
找到这个部分
Use Of Enumerations - 枚举的使用 - Java - 细节狂魔_第8张图片
Use Of Enumerations - 枚举的使用 - Java - 细节狂魔_第9张图片
也就是说 之所以我们咋 enum 类中,看不到 values 方法 ,是因为 它是编译器在程序运行起来的时候,创建 Enum 类时,会自动添加一些特殊方法,其中就包括 values 方法。
现在明白了吧! values 竟然隐藏的如此深,真的牛皮。


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

目前个人觉得这个功能很鸡助。。
Use Of Enumerations - 枚举的使用 - Java - 细节狂魔_第10张图片


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

Use Of Enumerations - 枚举的使用 - Java - 细节狂魔_第11张图片


枚举对象

Use Of Enumerations - 枚举的使用 - Java - 细节狂魔_第12张图片


枚举优缺点

优点:

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


缺点:

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


枚举和反射

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

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

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


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

Use Of Enumerations - 枚举的使用 - Java - 细节狂魔_第13张图片

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


总结

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

你可能感兴趣的:(数据结构,-,java,java,开发语言,后端)