记录是类的语法糖吗?

gui*_*792 22 java record java-record

我最近发现了 Java记录,了解它们的存在和用途真是太神奇了。

然而,我开始怀疑它们是否本质上只是幕后的类。

这是否意味着在编译过程中,它们会被转换为具有最终私有字段、公共构造函数和必要的 getter 的显式类?

cvk*_*cvk 37

在幕后它仍然会创建一个类(派生自java.lang.Record)。

你可以自己尝试一下:

// test.java
record Test(int foo, String bar) {}
Run Code Online (Sandbox Code Playgroud)

当您使用 编译它并javac test.java再次反汇编它时,javap Test您将得到以下代码:

final class Test extends java.lang.Record {
  Test(int, java.lang.String);
  public final java.lang.String toString();
  public final int hashCode();
  public final boolean equals(java.lang.Object);
  public int foo();
  public java.lang.String bar();
}
Run Code Online (Sandbox Code Playgroud)

  • Java 不关心机器代码级别,那是 JVM 的实现细节。显然,“记录”不会神奇地利用 CPU 上以前未使用的指令或访问以前无法访问的寄存器或内存区域,它们最终只是一种特殊的类。但是,通过检查机器代码级别来定义 Java 中的某个功能是否为“语法糖”,就像通过使用光栅电子显微镜检查各个焊接点来询问如何建造飞机一样:您会发现*某些东西*,但您可能会错过整个点。 (16认同)