提问人:guizo792 提问时间:11/16/2023 最后编辑:Basil Bourqueguizo792 更新时间:11/17/2023 访问量:1800
记录是类的句法糖吗?
Are records syntactic sugar for classes?
问:
我最近发现了 Java 记录,了解它们的存在和用途真是太棒了。
然而,我开始怀疑它们本质上是否只是幕后的课程。
这是否意味着在编译过程中,它们被转换为具有最终私有字段、公共构造函数和必要 getter 的显式类?
答:
35赞
cvk
11/16/2023
#1
在后台,它仍然会创建一个类(派生自 java.lang.Record
)。
您可以自己尝试一下:
// test.java
record Test(int foo, String bar) {}
当你编译它并再次反汇编它时,你会得到以下代码: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();
}
评论
0赞
supercat
11/17/2023
在机器码级别呢?例如,如果一个函数创建并返回一个具有特定字段的值,而不保留对对象的任何其他引用,并且调用者检索字段并在这样做后放弃对对象的所有引用,那么 JVM 是否能够生成避免创建和放弃对象实例的机器代码?Record
14赞
Joachim Sauer
11/17/2023
Java 不关心机器代码级别,这是 JVM 的实现细节。显然,它不会神奇地利用 CPU 上一些以前未使用的指令或访问以前无法访问的寄存器或内存区域,它们最终只是一种特殊的类。但是,在Java中,通过检查机器代码级别来定义一个特性是否是“语法糖”,就像问如何用光栅电子显微镜检查单个焊接点来构建飞机一样:你会发现一些东西,但你可能错过了整个点。record
评论
Record
java.lang.Record
Record
Record
Record
java.lang.Record