Java中枚举的实现原理介绍

 更新时间:2021年12月14日 15:07:18   作者:恒生LIGHT云社区  
大家好,本篇文章主要讲的是Java中枚举的实现原理介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

基本概述

在 JDK1.5 之前,通过定义常量使用的都是:public static fianl。而枚举的设计,就是把相关的常量分组到一个枚举类型里,方便创建和管理。

比如我们要定义一个颜色常量:

public enum Colour {
    RED, YELLOW, BLUE, GREEN
}

这段代码通过底层编译后,实际创建了4个枚举对象:

new Enum<EnumTest>("RED", 0);
new Enum<EnumTest>("YELLOW", 1);
new Enum<EnumTest>("BLUE", 2);
new Enum<EnumTest>("GREEN", 3);

使用方式

条件选择

enum 能通过 switch 方法进行简单条件判断

Colour color = Colour.RED;
switch (color) {
    case RED:
        System.out.println("红色");
        break;
    case YELLOW:
        System.out.println("黄色");
        break;
    case GREEN:
        System.out.println("绿色");
        break;
    case BLUE:
        System.out.println("蓝色");
        break;
    default:
        System.out.println(color);
        break;
}

循环遍历

通过循环遍历 .values() 能够取到对象中的值

for (Colour e : Colour.values()) {
    System.out.println(e.toString());
}

集合映射

在我们使用枚举类型作为集合的类型或映射中的键的类型时,可以使用专门且高效的集合和映射实现。如: java.util.EnumSetjava.util.EnumMap

// EnumSet的使用
EnumSet<Colour> colorSet = EnumSet.allOf(Colour.class);
for (Colour color : colorSet) {
    System.out.println(color);
}

// EnumMap的使用
EnumMap<Colour, String> colorMap = new EnumMap(Colour.class);
colorMap.put(Colour.RED, "红色");
colorMap.put(Colour.YELLOW, "黄色");
colorMap.put(Colour.GREEN, "绿色");
colorMap.put(Colour.BLUE, "蓝色");

Set<Map.Entry<Colour, String>> colorEntries = colorMap.entrySet();
for (Map.Entry<Colour, String> entry : colorEntries) {
    System.out.println(entry.getKey().name() + ":" + entry.getValue());
}

常用方法

通过 java.lang.Enum 类的源码,可以探索下枚举常用的一些方法和设计思想:

// Enum 唯一的构造函数,由于 protected 修饰,所以不能调用这个构造函数。 它供编译器为响应枚举类型声明而发出的代码使用。
protected Enum(String name, int ordinal) {
    this.name = name;
    this.ordinal = ordinal;
}
```
// 返回此枚举常量的名称,与在其枚举声明中声明的完全相同。
public final String name() {
    return name;
}
```
// 返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量被分配零序数)。(但大多数程序员不会使用这种方法)
public final int ordinal() {
    return ordinal;
}
```
// 与指定的对象进行比较以进行排序,当此对象小于、等于或大于指定对象时,返回一个负整数、零或正整数。且只能与相同枚举类型的其他枚举常量进行比较。 
public final int compareTo(E o) {
    Enum<?> other = (Enum<?>)o;
    Enum<E> self = this;
    if (self.getClass() != other.getClass() 
        self.getDeclaringClass() != other.getDeclaringClass())
        throw new ClassCastException();
    return self.ordinal - other.ordinal;
}
```
// 返回与此枚举常量的枚举类型对应的 Class 对象。
public final Class<E> getDeclaringClass() {
    Class<?> clazz = getClass();
    Class<?> zuper = clazz.getSuperclass();
    return (zuper == Enum.class) ? (Class<E>)clazz : (Class<E>)zuper;
}
```
## 底层原理

`enum` 的语法结构可能对于正常的 Java 看起来怪怪的,但是通过编译器编译后产生的是一个 `.class` 文件, 可以理解枚举的语法结构是一种规范,使编译器能识别并转化为相应的类,底层实际上还是 `class` 。

```java
public class com.project.demo.Colour extends java.lang.Enum{
    public static final com.project.demo.Colour RED;
    public static final com.project.demo.Colour YELLOW;
    public static final com.project.demo.Colour BLUE;
    public static final com.project.demo.Colour GREEN;
    static {};
}

总结

所以 enum 实际上在 Java 只是一个类的形式存在,它能够更加方便的帮助我们定义常量对象,并且支持定义属性和方法,在一定程度上提高了我们的编程效率。

但是在使用时需要注意, enum 不能支持继承,应该它已经继承了包里的 java.lang.Enum 类,所以在程序设计时我们需要考虑到。

到此这篇关于Java中枚举的实现原理介绍的文章就介绍到这了,更多相关Java枚举实现原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 再谈java回调函数

    再谈java回调函数

    个人对于回调函数的理解就是回调函数就是回头再调用的函数,哈哈,下面我们来详细探讨下回调函数。
    2015-07-07
  • Java Spring框架简介与Spring IOC详解

    Java Spring框架简介与Spring IOC详解

    Spring 框架是一个轻量级的解决方案,可以一站式地构建企业级应用。它是为了解决 企业应用开发的复杂性而创建的。Spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。IOC 是 Inversion of Control 的缩写,多数书籍翻译成控制反转
    2021-09-09
  • HashMap红黑树入门(实现一个简单的红黑树)

    HashMap红黑树入门(实现一个简单的红黑树)

    红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。 红黑树发明时被称为平衡二叉B树,后来修改为如今的“红黑树”
    2021-06-06
  • Java中Boolean引发缺陷的解决

    Java中Boolean引发缺陷的解决

    本文主要介绍了Java中Boolean引发缺陷的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 深入浅析SSH的三个组件ssh、sftp、scp

    深入浅析SSH的三个组件ssh、sftp、scp

    SSH 包含3个组件,文中给大家详细提到。这篇文章主要介绍了SSH的三个组件ssh、sftp、scp ,需要的朋友可以参考下
    2018-10-10
  • SpringBoot注册Servlet的三种方法详解

    SpringBoot注册Servlet的三种方法详解

    这篇文章主要介绍了SpringBoot注册Servlet的三种方法详解,教你如何Spring Boot 注册 Servlet、Filter、Listener,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • SpringBoot项目中使用Mockito的示例代码

    SpringBoot项目中使用Mockito的示例代码

    这篇文章主要介绍了SpringBoot项目中使用Mockito的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Sentinel Dashboard限流规则保存方式

    Sentinel Dashboard限流规则保存方式

    这篇文章主要介绍了Sentinel Dashboard限流规则保存方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java MyBatis实战之QueryWrapper中and和or拼接技巧大全

    Java MyBatis实战之QueryWrapper中and和or拼接技巧大全

    在Java中QueryWrapper是MyBatis-Plus框架中的一个查询构造器,它提供了丰富的查询方法,其中包括and和or方法,可以用于构建复杂的查询条件,这篇文章主要给大家介绍了关于Java MyBatis实战之QueryWrapper中and和or拼接技巧的相关资料,需要的朋友可以参考下
    2024-07-07
  • java适配器模式之万物拟人化

    java适配器模式之万物拟人化

    本文详细介绍了什么是适配器模式,适配器模式的种类以及各种类的详细讲解等,需要学习该知识点的小伙伴可以参考这篇文章
    2021-08-08

最新评论