Enum元素如何在内部排列或链接?

在Java中,Enum是一种特殊的datatype ,通过查看单词datatype,我得到了一些问题,比如它在内存中预定义的内存大小,或者Enum的元素是否设置为任何data structureQueue以便快速访问。

根据Java doc

The enum declaration defines a class (called an enum type). The enum class body can include methods and other fields. The compiler automatically adds some special methods when it creates an enum The enum declaration defines a class (called an enum type). The enum class body can include methods and other fields. The compiler automatically adds some special methods when it creates an enum

为什么编译器会为枚举添加特殊方法。 有人能说清楚吗?

资源

提前致谢?

为什么编译器会为枚举添加特殊方法。

因此,您可以轻松地获取枚举类型的值。

唯一的额外方法valueOfvalues 。 此外,还有公共静态最终字段 ,每个字段对应一个类型的值,这样您就可以实际访问该类型的受约束值集。

想象一下,编译器没有添加valueOfvalues方法(或者至少是values方法) – 你将如何访问“枚举类型的所有值”? 这通常是一件有用的事情。

现在EnumSet提供了类似的function,但要获得“所有值”,你必须提供一个Class<>引用,这可能很痛苦。 values方法调用起来稍微简单一些(尽管可能也更昂贵)。

有关确切提供的内容的更多详细信息,请参阅JLS第8.9节 。

为了回答值的存储方式,我们指定每个值都有一个静态字段,但作为一个实现细节 ,Oracle Java编译器还包括一个带有数组的静态字段 – 该数组基本上是在values方法中克隆的。

你可以自己看看:

 enum Foo { BAR, BAZ; } 

编译:

 javac Foo.java 

编译:

 javap -private Foo Compiled from "Foo.java" final class Foo extends java.lang.Enum { public static final Foo BAR; public static final Foo BAZ; private static final Foo[] $VALUES; public static Foo[] values(); public static Foo valueOf(java.lang.String); private Foo(); static {}; } 

如果你使用javap -c你会看到values()基本上是:

 public static Foo[] values() { return (Foo[]) $VALUES.clone(); } 

静态初始化程序块创建有限的实例集并设置字段。

Java Enum并不是那么特别。

这是一堂课。

Enum中的元素是作为类实例的对象。

有一些微妙的差异。 出于显而易见的原因,Enum可能没有构造函数作为其导出的API的一部分。 JVM会花一些时间来确保每个元素只创建一个实例,即使是可序列化的。 因此,您可以使用==来测试枚举元素,即使这对其他类型的对象来说是非常不可取的。

是的,Java编译器会向Enum添加预定义的方法,但您也可以自由添加。 事实上,虽然Enum可能不会扩展另一个类,但Enum实现接口是完全可以允许的。

TL; DR:将Java Enum视为Class的特例,为方便起见,使用一些预定义的方法。 元素是类的对象。

您可以使用GrepCode查看java.lang.Enum ,它是所有枚举类型扩展的类。 希望这将为实施提供一些启示。 顺便说一句,除了作为枚举类型一部分的valueOf()和values()之外,还有.toString()和.ordinal()方法。 有一些标准方法,如.equals和.hashcode,它们是枚举中值的一部分。 所以有很多可用的function。