レコード - record命令
[modifier] record name(type field, ...) {
definition
}
modifier:修飾子
name:レコード名
type:フィールドの型
field:フィールドの名前
definition:メンバーの定義
もともと、クラスとはデータ(フィールド)と手続き(メソッド)の集合から構成されるしくみです。しかし、実際のアプリではデータだけを扱うことを目的としたクラスが一定数存在します。Java 16以降では、このようなクラスをより簡単に扱うためのしくみ――#レコード#を提供しています。
レコードは、record命令を使って定義できます。たとえば以下は、name、ageフィールドを持ったAnimalレコードの例です。
Animal.java
- public record Animal(String name, int age) {}
record命令では、以下のようなメンバーを自動生成してくれます(*)。
- コンストラクター
- フィールドにアクセスするためのゲッター
- equals/hashCodeメソッド
- toStringメソッド
*)もちろん、recordブロック配下に任意のメンバーを追加することも可能です。
よって、上のAnimalクラスは、以下のような呼び出しが可能です。
RecordClient.java
- package com.example.mynavi.record;
- public class RecordClient {
- public static void main(String[] args) {
- var a1 = new Animal("しずく", 8);
- var a2 = new Animal("しずく", 8);
- System.out.println(a1); // 結果:Animal[name=しずく, age=8]
- System.out.println(a2.name()); // 結果:しずく
- System.out.println(a1.equals(a2)); // 結果:true
- System.out.println(a1 == a2); // 結果:false
- }
- }
ちなみに、レコードはイミュータブルなクラスを生成します。よって、フィールドを設定するためのセッターはありません。
- オブジェクト指向構文_目次
- class命令
- new演算子
- フィールドを定義する
- static final修飾子
- メソッドを定義する
- コンストラクターを定義する
- レコード
- package宣言
- import命令
- import static命令
- ネストしたクラスを定義する
- モジュール
監修
山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。