Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
record
イミュータブル(変更不可)なデータクラスを簡潔に定義する構文です(Java 16正式導入)。フィールド・コンストラクタ・ゲッター・equals() / hashCode() / toString() が自動生成されます。
構文
// recordの定義です。カッコ内のコンポーネントがフィールドになります。
record RecordName(型 フィールド名1, 型 フィールド名2) {
// 追加のメソッドを定義することもできます。
}
// コンパクトコンストラクタ(引数リストを省略した記法)でバリデーションを行います。
record Point(int x, int y) {
Point {
if (x < 0 || y < 0) throw new IllegalArgumentException("座標は0以上にしてください。");
}
}
// アクセサメソッドはコンポーネント名と同名(get不要)です。
Point p = new Point(3, 4);
int x = p.x(); // x() でxフィールドにアクセスします。
int y = p.y();
// recordはfinalクラスなので継承できません。インターフェースは実装できます。
record Range(int start, int end) implements Comparable<Range> {
@Override
public int compareTo(Range other) { return Integer.compare(start, other.start); }
}
自動生成される機能一覧
| 機能 | 概要 |
|---|---|
| コンストラクタ | すべてのコンポーネントを引数に取る標準コンストラクタが自動生成されます。 |
| アクセサメソッド | 各コンポーネントと同名のゲッターが自動生成されます(getName() ではなく name())。 |
| equals() | すべてのコンポーネントが等しい場合に true を返します。 |
| hashCode() | すべてのコンポーネントを元にハッシュコードを生成します。 |
| toString() | RecordName[field1=value1, field2=value2] 形式の文字列を返します。 |
サンプルコード
// シンプルなrecordの定義と使用です。
record Point(int x, int y) {}
Point p1 = new Point(3, 4);
Point p2 = new Point(3, 4);
System.out.println(p1.x()); // 『3』と出力されます。
System.out.println(p1.y()); // 『4』と出力されます。
System.out.println(p1); // 『Point[x=3, y=4]』と出力されます。
System.out.println(p1.equals(p2)); // 『true』と出力されます。
// バリデーション付きrecordを定義します。
record Person(String name, int age) {
Person {
if (name == null || name.isBlank()) throw new IllegalArgumentException("nameは空にできません。");
if (age < 0) throw new IllegalArgumentException("ageは0以上にしてください。");
}
// 追加メソッドを定義します。
String greeting() {
return "こんにちは、" + name + "(" + age + "歳)です。";
}
}
Person alice = new Person("Alice", 30);
System.out.println(alice.greeting()); // 『こんにちは、Alice(30歳)です。』と出力されます。
// インターフェースを実装します。
record Temperature(double celsius) {
double toFahrenheit() { return celsius * 9 / 5 + 32; }
}
Temperature t = new Temperature(100.0);
System.out.println(t.toFahrenheit()); // 『212.0』と出力されます。
概要
recordはデータを保持するだけの「データクラス」を定義するための構文です。従来は多数の定型コード(コンストラクタ・ゲッター・equals() など)が必要でしたが、recordを使うことで1行で定義できます。
recordのフィールドはすべてイミュータブル(final)であり、一度生成したインスタンスの値を変更することはできません。recordは暗黙的に final クラスとなるため継承はできませんが、インターフェースの実装は可能です。
列挙型との使い分けについては『enum』を、クラスの基本定義については『class / new / コンストラクタ / this』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。