我最近发现了Java的records,了解到它们的存在和目的真是令人惊叹。
然而,我开始想知道它们是否本质上只是幕后的类。
这是否意味着在编译过程中,它们会被转换为具有最终私有字段、公共构造函数和必要的getter方法的显式类呢?
然而,我开始想知道它们是否本质上只是幕后的类。
这是否意味着在编译过程中,它们会被转换为具有最终私有字段、公共构造函数和必要的getter方法的显式类呢?
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();
}
Record
,而不保留对该对象的任何其他引用,并且调用者在获取字段值后丢弃了所有对该对象的引用,那么JVM是否能够生成避免创建和丢弃对象实例的机器代码? - undefined
Record
的限制可能会让编译器作者更容易做一些事情,但正如答案所指出的那样,在底层,它只是一个具有特定设计的类,唯一的独特之处在于它继承自java.lang.Record
(它本身没有任何有意义的行为,只是被序列化和记录模式特别识别)。 - undefined