一、背景及定义
枚举是在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 ,但是其默认继承了这个类。
二、枚举类的创建
public enum TestEnum {
RED,BLACK,GREEN;
}
三、枚举类的使用
3.1、调用枚举中的量
3.2、switch 语句
3.3、枚举类的常用方法
方法名称 | 描述 |
---|---|
values() | 以数组形式返回枚举类型的所有成员 |
ordinal() | 获取枚举成员的索引位置 |
valueOf() | 将普通字符串转换为枚举实例 |
compareTo() | 比较两个枚举成员在定义时的顺序 |
3.3.1、values() – 以数组形式返回枚举类型的所有成员
3.3.2、ordinal() 获取枚举成员的索引位置
3.3.3、valueOf() 将普通字符串转换为枚举实例
3.3.4、compareTo() 比较两个枚举成员在定义时的顺序
3.4、枚举对象
四、枚举优缺点
优点:
- 枚举常量更简单安全 。
- 枚举具有内置方法 ,代码更优雅
缺点:
3. 不可继承,无法扩展,【从构造的方法的私有性就能看出来】
五、枚举和反射
枚举是否可以通过反射,拿到实例对象呢? -这道题是2017年阿里巴巴曾经问到的一个问题题
篇博文反射说到:任何一个类,哪怕其构造方法是私有的,我们也可以通过反射拿到它的实例对象,那么枚举的构造方法也是私有的,我们是否可以拿到呢?接下来,我们来实验一下:
六、总结
- 1、枚举 将常量组织起来统一进行管理,更简单安全。
- 2、枚举本身就是一个类,其构造方法默认为私有的,且都是默认继承于 java.lang.Enum
- 3、 枚举可以避免反射和序列化问题:枚举类非常安全!
- 4、不可继承,无法扩展。
- 5、枚举具有内置方法 ,代码更优雅