java - 枚举元素如何在内部排列或链接?

标签 java enums

在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 .

为什么编译器向枚举添加特殊方法。有人能解释一下吗?

Source

提前致谢?

最佳答案

Why the compiler adds special methods to enum.

这样您基本上就可以轻松获取枚举类型的值。

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

假设编译器没有添加 valueOfvalues方法(或至少 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/

相关文章:

java - Golang enum 可以像 Java 的 enum 一样做同样的行为吗?

java - 在 ApplicationContext 被销毁之前立即触发的 Spring 关闭事件?

java - FIXME : NYI in MutableCallSite. syncAll 是否意味着尚未实现?

java - 为什么 Java 需要 EnumClass.VALUE 而不仅仅是 VALUE?

objective-c - Objective-C 中有类似 Java 枚举的东西吗?

java - 如何从 AFP 文件中提取元数据?

java - 如何在 Spring Boot 应用程序中引发错误情况

Python——使用函数属性作为返回值

c# - C# 中枚举的行为

可绑定(bind)到 DDL 的 C# 全局变量/常量,但名称为 "Nice"