レコード

編集

Java16でrecord型追加された[1]。レコードという名前のとおり、インスタンス作成時の一度しか書き換えをしない記録を書くためのものである。

クラスを用いても同じ動作のものを作れるが、レコード型を使うことによりコード量が短くなるし、意図も明確になる等、利点がある。

コード例
sample.java
class sample {
    public static void main(String[] args) {
        record Person(String name, int year) {}

        var a = new Person("Tom", 13);
        System.out.println(a.name()); // Tom
        System.out.println(a.year()); // 13
        System.out.println(a); // Person[name=Tom, year=13]

        var b = new Person("John", 15);
        System.out.println(b.name); // John
        System.out.println(b.year); // 15
        System.out.println(b); // Person[name=John, year=15]
    }
}
実行結果
Tom
13
Person[name=Tom, year=13]
John
15 
Person[name=John, year=15]
レコード定義
record Person(String name, int year) {}

は、次の標準クラスと同等です

public final class Person {
    private final String name;
    private final int year;

    public Person(String name, int year) {
        this.name = name;
        this.year = year;
    }

    String name() { return this.name; }
    int year()  { return this.year; }

    // equals() と hashCode() を実装し、2つのレコードオブジェクトが同じ型であり、
    // 同じフィールド値を含む場合、等しいことを指定する。
    public boolean equals...
    public int hashCode...

    // toString() の実装で、レコードクラスのすべてのフィールドの名前と文字列表現を返す。
    public String toString() {...}
}

インスタンスの作成の際には上記コードのようにfinal var aのようにfinal修飾子をつけなくても、record型のインスタンスを作成する際は自動的にそのインスタンスがfinal になり、書き換え不能になる。

なお、final var a = new Person("Tom", 13);のようにfinal をつけてインスタンスを作成しても、正常に動く(結果は上記と同じ)。


  1. ^ Record (Java SE 16 & JDK 16)” (2021年7月20日). 2022年7月1日閲覧。