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

枚举的背景及定义

枚举是在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、枚举具有内置方法 ,代码更优雅

猜你喜欢

转载自blog.csdn.net/DarkAndGrey/article/details/123195198