在Java中,枚举是一种特殊的datatype
,通过查看“数据类型”这个词,我得到了几个问题,比如它在内存中是否有预定义的内存大小,或者 Enum
中的元素是否存在?设置为任何 data structure
喜欢 Queue
以便快速访问。
根据 Java 文档
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
.
为什么编译器向枚举添加特殊方法。有人能解释一下吗?
提前致谢?
最佳答案
Why the compiler adds special methods to enum.
这样您基本上就可以轻松获取枚举类型的值。
唯一的额外方法是 valueOf
和values
。此外,还有公共(public)静态最终字段,每个类型的值对应一个 - 同样,这样您就可以实际访问该类型的受约束的值集。
假设编译器没有添加 valueOf
和values
方法(或至少 values
方法) - 如何访问“枚举类型的所有值”?这通常是一件有用的事情。
现在 EnumSet
提供类似的设施,但要获得“所有值”,您必须提供 Class<>
引用,这可能会很痛苦。 values
方法调用起来稍微简单一些(尽管也可能更昂贵)。
请参阅JLS section 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<Foo> {
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();
}
静态初始化 block 创建有限的实例集并设置字段。
关于java - 枚举元素如何在内部排列或链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16842319/