2

In Java Enum is a special kind of datatype, by looking at the word datatype I got few questions like does it have predefined memory size in memory or Are the elements in Enum set to any data structure like Queue for fast access.

As per 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.

Why the compiler adds special methods to enum. Could anybody shed light on this?

Source

Thanks in advance?

4

3 回答 3

4

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

这样您就可以轻松获得枚举类型的值。

唯一的额外方法valueOfand values。此外,还有公共静态最终字段,每个类型的值都有一个 - 再次,这样您就可以实际访问该类型的约束值集。

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

现在EnumSet提供了类似的设施,但是要获得“所有值”,您必须提供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<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();
}

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

于 2013-05-30T17:25:38.360 回答
2

Java Enum 并没有那么特别。

这是一个类。

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

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

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

TL;DR:为方便起见,将 Java 枚举视为具有一些预定义方法的类的特例。元素是类的对象。

于 2013-05-30T17:40:32.293 回答
1

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

于 2013-05-30T17:42:26.780 回答