Java/レコード
< Java
レコード
編集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 をつけてインスタンスを作成しても、正常に動く(結果は上記と同じ)。
- ^ “Record (Java SE 16 & JDK 16)” (2021年7月20日). 2022年7月1日閲覧。