Java 14レコードが実際に同様のデータクラスよりも少ないメモリを使用することを願っています。
それらか、メモリ使用量は同じですか?
私は以下のいくつかの迅速で汚いテストをしました
public record PersonRecord(String firstName, String lastName) {}
vs.
import Java.util.Objects;
public final class PersonClass {
private final String firstName;
private final String lastName;
public PersonClass(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String firstName() {
return firstName;
}
public String lastName() {
return lastName;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PersonClass that = (PersonClass) o;
return firstName.equals(that.firstName) &&
lastName.equals(that.lastName);
}
@Override
public int hashCode() {
return Objects.hash(firstName, lastName);
}
@Override
public String toString() {
return "PersonRecord[" +
"firstName=" + firstName +
", lastName=" + lastName +
"]";
}
}
コンパイルされたレコードファイルは1.475バイト、クラスは1.643バイトです。サイズの違いはおそらく、equals/toString/hashCodeの実装の違いによるものです。
多分誰かがいくつかのバイトコードを掘ることができます...
正解です。[@ lugiorgi]と[@Naman]に同意します。レコードと同等のクラス間で生成されたバイトコードの唯一の違いは、メソッドの実装にあります:toString
、equals
およびhashCode
。レコードクラスの場合は、動的な(インディ)呼び出しを使用して、クラスの同じbootstrapメソッドに実装されます:Java.lang.runtime.ObjectMethods
(レコードプロジェクトで新たに追加されました)。これらの3つのメソッド、toString
、equals
、およびhashCode
が同じbootstrapメソッドを呼び出すことにより、クラスファイルのスペースが節約されます。 3つの異なるブートストラップメソッドを呼び出します。もちろん、他の回答ですでに示したように、明白なバイトコードを生成するよりも多くのスペースを節約します