web-dev-qa-db-ja.com

Java 14レコードは、実際には同様のクラス宣言よりもメモリを節約しますか、それとも構文糖に似ていますか?

Java 14レコードが実際に同様のデータクラスよりも少ないメモリを使用することを願っています。

それらか、メモリ使用量は同じですか?

9
Clancy Merrick

私は以下のいくつかの迅速で汚いテストをしました

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の実装の違いによるものです。

多分誰かがいくつかのバイトコードを掘ることができます...

1
lugiorgi

正解です。[@ lugiorgi]と[@Naman]に同意します。レコードと同等のクラス間で生成されたバイトコードの唯一の違いは、メソッドの実装にあります:toStringequalsおよびhashCode。レコードクラスの場合は、動的な(インディ)呼び出しを使用して、クラスの同じbootstrapメソッドに実装されます:Java.lang.runtime.ObjectMethods(レコードプロジェクトで新たに追加されました)。これらの3つのメソッド、toStringequals、およびhashCodeが同じbootstrapメソッドを呼び出すことにより、クラスファイルのスペースが節約されます。 3つの異なるブートストラップメソッドを呼び出します。もちろん、他の回答ですでに示したように、明白なバイトコードを生成するよりも多くのスペースを節約します

1
Vicente Romero