`

Java Enum 源码分析

    博客分类:
  • java
阅读更多
所有的Java枚举类型都继承自该抽象类。我们用关键字enum来声明枚举类型,不可以通过显式继承该抽象类的方式来声明。

public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable {
    
    private final String name;

    // 当前枚举常量名称
    public final String name() {
	return name;
    }

    private final int ordinal;

    // 当前枚举常量次序,从0开始
    public final int ordinal() {
	return ordinal;
    }

    // 专有构造器,我们无法调用。该构造方法用于由响应枚举类型声明的编译器发出的代码。 
    protected Enum(String name, int ordinal) {
	this.name = name;
	this.ordinal = ordinal;
    }

    // 返回枚举常量的名称,默认是返回name值。可以重写该方法,输出更加友好的描述。
    public String toString() {
	return name;
    }

    // 比较当前枚举常量是否和指定的对象相等。因为枚举常量是单例的,所以直接调用==操作符。子类不可以重写该方法。
    public final boolean equals(Object other) { 
        return this==other;
    }

    // 返回该枚举常量的哈希码。和equals一致,该方法不可以被重写。
    public final int hashCode() {
        return super.hashCode();
    }

    // 因为枚举常量是单例的,所以不允许克隆。
    protected final Object clone() throws CloneNotSupportedException {
	throw new CloneNotSupportedException();
    }

    // 比较该枚举常量和指定对象的大小。它们的类型要相同,根据它们在枚举声明中的先后顺序来返回大小(前面的小,后面的大)。子类不可以重写该方法
    public final int compareTo(E o) {
	Enum other = (Enum)o;
	Enum self = this;
	if (self.getClass() != other.getClass() && // optimization
            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) ? clazz : zuper;
    }

    // 返回带指定名称的指定枚举类型的枚举常量。名称必须与在此类型中声明枚举常量所用的标识符完全匹配。不允许使用额外的空白字符。
    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 const " + enumType +"." + name);
    }

    // 不允许反序列化枚举对象
    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");
    }

    // 枚举类不可以有finalize方法,子类不可以重写该方法
    protected final void finalize() { }
}
分享到:
评论

相关推荐

    enum 结构分析源码

    在这个“enum 结构分析源码”资源中,我们主要关注的是C语言中的枚举使用和实现。C语言中的enum并不是一种真正的类型,而是对整型变量的一种别名,它提供了更易读的常量名称。 首先,我们来看`enum.c`这个源文件。...

    javaenum源码-chapter_19_enum_think_in_java:chapter_19_enum_think_in_javac

    3. 枚举源码分析: Java枚举的源码实现中,每个枚举实例都是类的一个静态常量,存储在类的静态域中。`Enum`类提供了许多用于操作枚举的内置方法,如`name()`返回枚举常量的名称,`compareTo()`比较枚举实例的顺序等...

    codes_java_疯狂java讲义源码_principler6q_elevenfza_

    通过深入学习和实践这些源码,读者不仅可以掌握Java编程的基本技能,还能提升分析问题和解决问题的能力。在实际工作中,这样的实践经验将极大地提高编程效率和代码质量。所以,这个压缩包是一份非常宝贵的资料,值得...

    捕鱼达人小游戏Java源码包

    通过分析和学习这个源码,我们可以深入了解Java游戏开发的基础知识,以及如何使用Java来创建交互式的娱乐应用程序。 首先,Java作为一款跨平台的编程语言,具有丰富的类库和强大的性能,适合开发各种类型的游戏。在...

    自己制作的JAVA日历源码

    在Java编程领域,创建一个日历应用是一项常见的练习,它能帮助开发者巩固基础并实践面向...通过分析和理解源码,开发者不仅可以了解如何创建一个实用的日历应用,还能深入理解Java的图形用户界面设计和时间日期操作。

    Java源码查看枚举类型定义.rar

    本资源"Java源码查看枚举类型定义.rar"包含了关于Java枚举类型的详细解释和实例,旨在帮助开发者深入理解这一特性。 首先,枚举类型在Java中通过关键字`enum`声明。例如: ```java public enum Color { RED, ...

    dl_java_源码.zip

    学习和分析这样的源码可以帮助提升Java编程技能,理解实际项目中的编程实践,同时也可以借鉴优秀代码的编写方式。对于初学者来说,这是一个了解实际项目结构和编程习惯的好机会;对于有经验的开发者,它可以提供新的...

    java俄罗斯方块源码

    源码中可能会有枚举(Enum)或类来表示这些状态。 8. **游戏逻辑**:源码会展示如何实现方块的生成、移动、旋转、碰撞检测、得分计算等核心逻辑。这部分涉及复杂性较高,但也是学习的重点。 9. **资源管理**:如果...

    java贪吃蛇游戏(源码)

    【Java贪吃蛇游戏源码解析】 在编程领域,实现一款经典的贪吃蛇游戏是学习基础编程和控制台交互的好方法。本项目是使用Java语言编写的...通过分析和理解源码,开发者可以提升自己的编程技能,同时享受游戏开发的乐趣。

    Java小游戏-推箱子源码

    源码分析: 1. **项目结构**:压缩包中的文件结构通常是Java项目的标准布局。`推箱子.iml`是IntelliJ IDEA项目的配置文件,`src`目录存放源代码,`out`目录包含编译后的字节码文件,`.idea`目录存储IDE的项目设置,...

    基于Java的扫雷源码.zip

    【标题】基于Java的扫雷源码分析 在编程领域,扫雷游戏是常见的学习项目,因为它涉及到逻辑推理、二维数组操作以及用户交互等多方面的技术。本篇将深入探讨一个基于Java实现的扫雷游戏的源码,帮助读者理解Java编程...

    Java剪刀石头布小游戏源码整理

    通过分析和理解这段源码,不仅可以提高Java编程技能,还能深入理解游戏开发的基本原理。记得查看提供的"下载及使用说明.txt"来获取源码的使用指南,以及使用"查看文件解压密码(网址即为解压密码).url"提供的网址...

    疯狂Java讲义源码(第三部分)

    6. **枚举类型Enum**:解释了Java中枚举类型的用法,以及如何创建和使用枚举常量。 7. **迭代器Iterator**:阐述了迭代器接口及其作用,如何通过迭代器遍历集合。 ### 第9章:文件与流 本章关注Java中的文件操作和...

    java象棋开发源码

    总之,"java象棋开发源码"项目涵盖了从基础编程到高级算法的多个方面,对于学习Java和游戏开发的开发者来说,是一个很好的实践和学习素材。通过分析和理解这段代码,你可以提升自己的编程能力,同时也能了解到如何将...

    java五子棋 人机对战 源码及素材

    2. 胜负判断:AI不仅需要计算自己的胜利路径,还要防止对方形成五子连珠,因此会涉及到复杂的棋局分析。 四、资源管理 "META-INF"目录通常包含元数据,如MANIFEST.MF文件,它记录了类加载器如何查找和加载类。在...

    Java贪吃蛇源码

    Java贪吃蛇是一款基于Java编程语言开发的经典游戏,它的源码是学习Java基础、...通过分析Java贪吃蛇的源码,开发者不仅可以学习到上述知识点,还能深入了解如何将理论知识应用于实际项目,提升编程技能和问题解决能力。

    Java游戏俄罗斯方块源码

    通过学习和分析Java版的俄罗斯方块源码,不仅可以掌握基本的游戏开发流程,还能加深对Java语言的理解,提升编程技巧。此外,这种简单的项目也是实践和学习多线程、图形库(如JavaFX或Swing)以及游戏AI的好起点。 ...

    core Java 7th 英文版+源码

    《Core Java 7th Edition》是Java编程领域的一本经典著作,主要面向...通过分析和修改这些源码,可以加深对Java编程的理解,提高编程技能。对于想要深入理解Java 7的开发者来说,这本书和源码都是不可多得的学习资源。

    Java_java.zip

    通过阅读和分析"Java_java_源码.rar"中的源码文件,可以深入理解项目的架构、设计模式、算法和数据结构,从而提升编程技能。同时,这也是学习和研究开源项目、参与社区贡献以及解决实际问题的重要方式。

    java_俄罗斯方块源码

    《俄罗斯方块》是一款经典的游戏,它以简单的规则和高度的可玩性赢得了全球玩家的喜爱...在分析提供的`codefans.net`文件中,很可能是包含了一个完整的《俄罗斯方块》Java源码实现,可以从代码中学习到实际的应用示例。

Global site tag (gtag.js) - Google Analytics