枚举_源码_分析

枚举源码分析

前言

这是所有Java语言枚举类型的公共基类。关于枚举的更多信息,包括编译器合成的隐式声明方法的描述,可以在Java的第8.9节中找到™ 语言规范。
请注意,当使用枚举类型作为集合的类型或映射中键的类型时,可以使用专门且高效的集合和映射实现

public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable

属性

第一个属性

在枚举声明中声明的此枚举常量的名称。大多数程序员应该使用toString方法,而不是访问这个字段。

 private final String name;

对应的方法

返回此枚举常量的名称,与在其枚举声明中声明的名称完全相同。大多数程序员应该优先使用toString方法,因为toString方法可能会返回一个更用户友好的名称。这种方法主要设计用于特殊情况,在这种情况下,正确性取决于获得确切的名称,而不同版本的名称不会有所不同。

    public final String name() {
        return name;
    }

第二个属性

此枚举常量的序数(它在枚举声明中的位置,其中初始常量被分配了一个序数0)。大多数程序员对这个不了解。它是为复杂的基于枚举的数据结构设计的,如java.util.EnumSet和java.util.EnumMap。

    private final int ordinal;

对应的方法

返回此枚举常量的序号(其在枚举声明中的位置,其中初始常量被分配了一个序号0)。大多数程序员对这个不了解。它是为复杂的基于枚举的数据结构设计的,如java.util.EnumSet和java.util.EnumMap。
返回值:这个枚举常量的序数

    public final int ordinal() {
        return ordinal;
    }

构造器

独有的构造器。程序员无法调用此构造函数。它由编译器在响应枚举类型声明时发出的代码使用


    protected Enum(String name, int ordinal) {
        this.name = name;
        this.ordinal = ordinal;
    }

方法

toString

返回声明中包含的此枚举常量的名称。此方法可能会被重写,尽管它通常不是必需的或所需的。当存在更“友好”的字符串形式时,枚举类型应该覆盖此方法。
返回值:此枚举常量的名称

   public String toString() {
        return name;
    }

equals

形参:other–要与此对象进行相等比较的对象。
返回值:如果指定的对象等于此枚举常量,则为true 否则为false

    public final boolean equals(Object other) {
        return this==other;
    }

hashCode

返回此枚举常量的哈希代码

    public final int hashCode() {
        return super.hashCode();
    }

clone

抛出 CloneNotSupportedException。这保证了枚举永远不会被克隆,这对于保持其“singleton”状态是必要的。

    protected final Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException();
    }

compareTo

将此枚举与指定的对象进行顺序比较。返回负整数、零或正整数,因为此对象小于、等于或大于指定的对象。

注意枚举常量只能与相同枚举类型的其他枚举常量进行比较。此方法实现的自然顺序是常量声明的顺序。

 public final int compareTo(E o) {
        Enum<?> other = (Enum<?>)o;
        Enum<E> self = this;
        if (self.getClass() != other.getClass() && // optimization
            self.getDeclaringClass() != other.getDeclaringClass())
            throw new ClassCastException();
        return self.ordinal - other.ordinal;
    }

getDeclaringClass

返回与此枚举常量的枚举类型对应的Class对象。当且仅当e1.getDeclaringClass()==e2.getDeclaring()时,两个枚举常量e1和e2具有相同的枚举类型。(对于具有常量特定类体的枚举常量,该方法返回的值可能与Object.getClass方法返回的数值不同。)

    @SuppressWarnings("unchecked")
    public final Class<E> getDeclaringClass() {
        Class<?> clazz = getClass();
        Class<?> zuper = clazz.getSuperclass();
        return (zuper == Enum.class) ? (Class<E>)clazz : (Class<E>)zuper;
    }

valueOf

返回具有指定名称的指定枚举类型的枚举常量。名称必须与用于声明此类型中的枚举常量的标识符完全匹配。(不允许使用外部空白字符。)
请注意,对于特定的枚举类型T,可以使用该枚举上隐式声明 {@code public static T valueOf(String)}方法代x替此方法来从名称映射到相应的枚举常量。枚举类型的所有常量都可以通过调用该类型的隐式的公共静态 {@code public static T[] values()} 方法来获得

形参:

​ enumType–要从中返回常量的枚举类型的Class对象

​ name–要返回的常量的名称

返回值

​ 具有指定名称的指定枚举类型的枚举常量

抛出:

IllegalArgumentException–如果指定的枚举类型没有具有指定名称的常量,或者指定的类对象不表示枚举类型

NullPointerException–如果enumType或name为null

    public static <T extends Enum<T>> T valueOf(Class<T> enumType,
                                                String name) {
        T result = enumType.enumConstantDirectory().get(name);
        if (result != null)
            return result;
        if (name == null)
            throw new NullPointerException("Name is null");
        throw new IllegalArgumentException(
            "No enum constant " + enumType.getCanonicalName() + "." + name);
    }

finalize

枚举类不能具有finalize方法

protected final void finalize() { }

readObject

防止默认反序列化


    private void readObject(ObjectInputStream in) throws IOException,
        ClassNotFoundException {
        throw new InvalidObjectException("can't deserialize enum");
    }

    private void readObjectNoData() throws ObjectStreamException {
        throw new InvalidObjectException("can't deserialize enum");
    }
}

从上面可以分析出

  1. 禁止枚举子类的泛型定义

image.png

image.png

image.png

注意将父类修改为枚举类后它由编译器在响应枚举类型声明时发出的代码使用

image.png

这个就证明了不能泛型定义因为没有构造器

唯一有的构造器还是独有的构造器它由编译器在响应枚举类型声明时发出的代码使用

  1. Enum类无法被继承
public class testEnum extends Enum{
}
public class testEnum extends Enum<Enum<E>>{
}
public class testEnum<E> extends Enum<Enum<E>>{
}

编译器转义之后

public final class Color extends Enum<Color> {
  public static final Color[] values() { return (Color[])VALUES.clone(); }
  public static Color valueOf(String name) { ... }

  private Color(String s, int i) { super(s, i); }

  public static final Color RED;
  public static final Color BLUE;
  public static final Color GREEN;

  private static final ColorVALUES[];

  static {
    RED = new Color("RED", 0);
    BLUE = new Color("BLUE", 1);
    GREEN = new Color("GREEN", 2);
    $VALUES = (new Color[] { RED, BLUE, GREEN });
  }
} 

当我们使用enum关键字定义一个枚举的时候,他会帮我们在编译后默认继承java.lang.Enum类,而不像其他的类一样默认继承Object类。且采用enum声明后,该类会被编译器加上final声明,故该类是无法继承的

  1. 抽象类不能被实例化

在java程序中不能使用new关键字来声明一个Enum,如果想要定义可以使用这样的语法:

enum  T1{
    value1,value2
    method1(){}
    method2(){}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/26031.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

斩获阿里offer,这份258页面试宝典也太顶了....

测试三年有余&#xff0c;很多新学到的技术不能再项目中得到实践&#xff0c;同时薪资的涨幅很低&#xff0c;于是萌生了跳槽大厂的想法 但大厂不是那么容易进的&#xff0c;前面惨败字节&#xff0c;为此我辛苦准备了两个月&#xff0c;又从小公司开始面试了半个月有余&#…

最系统的网络安全自学笔记+学习路线(超详细)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

虚拟机类加载机制

目录 1、概述 2、类加载的过程 1、过程总览 2、加载 3、链接-验证 4、链接-准备 5、链接-解析 6、初始化 7、总结 3、类加载的时机 4、类加载器 1、概述 2、类与类加载器 3、三层类加载器 4、双亲委派模型 5、其他加载策略 1、概述 一个Java类会被编译成一个Cl…

游戏封包加密方案解析

当下游戏市场已全面回暖&#xff0c;暑期档临近更将迎来大量新游上线&#xff0c;如此关键节点&#xff0c;游戏厂商应当更加注重游戏安全。 FairGuard发现近期游戏黑灰产攻击角度愈发刁钻&#xff0c;除了常见的内存修改外挂、注入挂&#xff0c;针对游戏封包破解的「脱机挂」…

chatgpt赋能python:Python图片处理教程

Python 图片处理教程 Python 是一种功能强大的编程语言&#xff0c;广泛应用于大量不同的行业和领域。其中之一是图像处理和分析。Python 提供了一个庞大的图像库&#xff0c;其拥有大量的工具和函数。Python 图像库具有高度的可扩展性&#xff0c;可以很容易地将其与其他库集…

Async 使用详解

Spring Boot异步调用Async 在实际开发中&#xff0c;有时候为了及时处理请求和进行响应&#xff0c;我们可能会多任务同时执行&#xff0c;或者先处理主任务&#xff0c;也就是异步调用&#xff0c;异步调用的实现有很多&#xff0c;例如多线程、定时任务、消息队列等&#xf…

【大数据分析】Hbase的基本原理

目录 Hbase 架构ClientZooKeeperMasterRegionServerHRegionStoreMemStoreStoreFileHFileHLog Hbase数据模型关于数据模型的其他概念Name SpaceTableRowColumnTime StampCell Hbase 架构 Client &#xff08;1&#xff09;.META.表&#xff0c;记录了用户所有表拆分出来的 Regi…

Redis数据类型之(哈希Hash和集合Set)

Redis数据类型之&#xff08;哈希Hash和集合Set&#xff09; 一定注意看红色注意项。 哈希&#xff08;Hash&#xff09;: Redis hash 是一个 string 类型的 field&#xff08;字段&#xff09; 和 value&#xff08;值&#xff09; 的映射表&#xff0c;hash 特别适合用于存…

龙芯2K1000实战开发-USB/PCIe/HDMI外设开发

文章目录 概要整体架构流程技术名词解释技术细节小结概要 提示:这里可以添加技术概要 本文主要针对2k1000的PCIE和USB外设的国产化设计 整体架构流程 提示:这里可以添加技术整体架构 使用2k1000自带的以太网pcie控制器,USB控制器。 考虑到龙芯没有HDMI接口,选用龙讯半…

springboot启动过程原理分析

前言 现在绝大多数java项目都上了Springboot框架, 因此深入理解Springboot框架的运行原理,能帮助我们更好的在Springboot框架下进行业务开发,同时能学习框架中优秀的设计思想, 本文主要是通过对Springboot源码的分析, 来理解整个springboot项目的启动流程. 因为Springboot不同…

AdaIN

AdaIN的全名是Adaptive Instance Normalization&#xff0c;源自风格迁移的论文Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization 假设原图和风格图经过VGG进行特征提取后得到shape分别为CxHxW和CxH‘xW’的特征图c和s&#xff0c;AdaIN的计算如…

JDBC查询数据库——普通、流式、游标

问题 通过JDBC对MySQL进行数据查询时&#xff0c;有个很容易踩的坑&#xff0c;以下面代码为例&#xff1a; public static void selectNormal() throws SQLException{Connection connection DriverManager.getConnection("jdbc:mysql://localhost:3306/test", &qu…

被迫在小公司熬了2年,现在我终于进了腾讯测试岗...

其实两年前校招的时候就往腾讯投了一次简历&#xff0c;结果很明显凉了&#xff0c;随后这个理想就被暂时放下了&#xff0c;但是这个种子一直埋在心里&#xff0c;想着总有一天会再次挑战的。 其实这两年除了工作以外&#xff0c;其余时间基本上都在学习&#xff0c;打磨自己…

Burp模块

Target模块 记录流量 1.Target按主机或域名分类记录 2.HTTP History 按时间顺序记录且会记录很多次 3.Target模块的作用 &#xff08;1&#xff09;把握网站的整体情况 &#xff08;2&#xff09;对一次工作的域进行分析 &#xff08;3&#xff09;分析网站存在的攻击面 …

从C语言到C++_14(vector的常用函数+相关选择题和OJ题)

目录 1. vector的常用函数 1.1 vector 的介绍 1.2 vector 的初始化 1.3 vector 的操作和遍历 1.4 vector 的容量和增删查改 2. vector 相关笔试题 3. vector 相关OJ题 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 解析代码&#xff1a; 118. 杨辉…

详解iPaaS与RPA的区别及各自的应用场景

随着企业数字化转型的加速&#xff0c;业务系统集成和自动化流程成为关键议题。本文旨在探讨iPaaS&#xff08;Integration Platform as a Service&#xff09;与RPA&#xff08;Robotic Process Automation&#xff09;在业务系统集成方面的区别&#xff0c;它们各自的用途和适…

Web端3D模型轻量化工具如何实现建筑行业“数字化”建设?

随着数字化技术的飞速发展&#xff0c;建筑行业也在不断寻找新的技术手段来提供高产能和建筑质量。其中&#xff0c;Web端3D模型轻量化工具HOOPS Communicator SDK在建筑行业中的应用不断地得到了市场的广泛注意和应用。本文将深入探讨HOOPS Communicator在建筑行业中的应用及其…

【Redis】浅谈Redis-集群(Cluster)

文章目录 前言1、集群实现1.1 创建cluster目录&#xff0c;并将redis.conf复制到该文件夹1.2 复制redis.conf&#xff0c;并进行配置1.3 启动redis&#xff0c;查看启动状态1.4 合成集群1.5 查看集群1.6 集群读写操作 2、SpringBoot整合redis集群2.1 引入包2.2 设置配置2.3 使用…

Codeforces Div.2 1798B Three Sevens题解

题目&#xff1a; 传送门 B. Three Sevens time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Lottery "Three Sevens" was held for m days. On day i, ni people with the numbers ai,1…

职场工作的前提

职场工作 目录概述需求&#xff1a; 设计思路实现思路分析1.职场工作 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive.…