浅谈枚举认识及原理(Enum)

**前言:**最近学习到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 知乎易哥

猜你喜欢

转载自blog.csdn.net/qq_18361601/article/details/106794246
今日推荐