**前言:**最近学习到Java枚举,在网上搜索了一圈发现都有很多种理解,在这里借鉴他人对枚举的介绍再总结自己的 一些浅见
1.枚举介绍
首先,枚举是 jdk1.5引入的新特性,枚举是一种规范,它规范了参数的形式.
说白了就是,枚举可以定义的一些常量和实例,规范参数的形式,好比定义一个常量类(规范参数的取值范围
)
举个例子:定义一个季节枚举,里面定义春夏秋冬的常量,当使用季节类型作为参数时,若使用该季节枚举作为参数,就限制了用户的参数输入,只能是春夏秋冬。
更通俗的理解就是:你想要的类型和常量,我都给你限定在枚举里了,你只能使用我限定的这些
官方语言:一个枚举的实例可以使用枚举项列表中任意单一项的值。枚举在各个语言当中都有着广泛的应用,通常用来表示诸如颜色、方式、类别、状态等等数目有限、形式离散、表达又极为明确的量。
2.用法
2.1.常量
比起定义常量public static fianal
修饰更方便是,枚举我直接写就行了,实则底层默认加上了public static fianal
public enum Color {
RED, GREEN, BLANK, YELLOW
}
2.2 switch语句
JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。
enum Signal {
GREEN, YELLOW, RED
}
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
case RED:
color = Signal.GREEN;
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
2.3向枚举中添加方法
如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。 枚举表示他很特别,需要你定义了他的规则,在使用其他的规则
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
// 普通方法
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
}
// get set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
2.4.覆盖枚举的方法
可以重写toString嘛
2.5.实现接口
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
2.6.使用接口组织枚举
2.7.关于枚举集合的使用
详细代码参考大佬博客Java 枚举(enum) 详解7种常见的用法
介绍总结:
以逗号隔开的,最后以分号结尾的,这部分叫做这个枚举的实例。也可以理解为,class new 出来的实例对象。但不是你想new多少就new多少,枚举的好处就在于限制某些东西的范围嘛
附言:我所了解的枚举可以使用到统一异常处理中,对异常进行统一处理,之后会总结一篇博客,其次就是以上所述的,规范参数类型
最后贴上枚举使用的规范
3.枚举更深层次的理解
3.1枚举的实现原理:
引出问题
1.定义一个枚举,
首先并没有定义name()和ordinal(),为什么能打印呢???
2.结果:
3.进入方法发现枚举的结构
4.为了得出结果,进行反编译:
枚举类做了什么?
总结出几点:
1. 枚举类编译后生成一个继承java.ang.Enum的类
2. 枚举类final修饰,无法再继承
3. 枚举值是枚举类的成员
4. 默认添加了很多方法(构造方法+默认方法+静态代码块)
最终的编译图:
3.原理总结:
使用enum定义的枚举类型,会编译转化为继承java.lang.Enum的类,定义的枚举值会被实例化我枚举类的一个个对象
同时,蒸饺了两个方法,values()和valuesof()
声明:
参考及转载至:https://zhuanlan.zhihu.com/p/51296740 知乎易哥