💡

【Java】レコードクラスについて

に公開

レコードクラスとは?

  • Java16で正式に追加された機能。
  • 「データを保持するためのクラス」を簡潔に記述できます。

今までは例えば以下のようにすべて手動で記述していたものを
※lombokを使わなかった場合

package recordTest;

import java.util.Objects;

public class Item {
	private final int id;
	private final String name;

	public Item(int id, String name) {
		this.id = id;
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	@Override
	public int hashCode() {
		return Objects.hash(id, name);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Item other = (Item) obj;
		return id == other.id && Objects.equals(name, other.name);
	}

	@Override
	public String toString() {
		return "Item [id=" + id + ", name=" + name + "]";
	}
}

レコードクラスならこれだけ!
コンストラクタ(引数あり)・getter・toString・equals・hashCode などが自動生成されます!

package recordTest;

record Item(int id,String name) {}

使用する側では以下のように記述します

package recordTest;

public class Main {
	public static void main(String[] args) {
		Item item=new Item(1,"りんご");
		//getterメソッドの代わりに、フィールド名のメソッドが自動生成される
		System.out.println(item.id());
		System.out.println(item.name());
		
		//toStringメソッドが呼ばれる
		System.out.println(item);
	}
}

<出力例>

特徴

  • フィールドは final(変更不可) になるため、後から値を変更できない
  • フィールドの値を変更するには、新しいインスタンスを生成する必要がある
  • 継承できない(record は final 扱い)
  • 自作のメソッドも追加出来る!
  • Bean Validationも使用出来る
  package recordTest;

record Item(int id, String name) {
	public void greet() {
		System.out.println("いらっしゃいませ");
	}
}
package recordTest;

public class Main {
	public static void main(String[] args) {
		Item item = new Item(1, "りんご");

		item.greet();

		//getterメソッドの代わりに、フィールド名のメソッドが自動生成される
		System.out.println(item.id());
		System.out.println(item.name());
	}
}

<出力例>

コンストラクタのカスタマイズ

例)商品名の文字数をチェックする処理をコンストラクタに追加

package recordTest;

record Item(int id, String name) {
	// 追加の処理を入れたコンストラクタ
	public Item {
		if (name.length() < 100) {
			throw new IllegalArgumentException("商品名は100文字以下でなければなりません");
		}
	}
}
package recordTest;

public class Main {
	public static void main(String[] args) {
		Item item = new Item(1, "りんご");
		
		Item item2 =new Item(2,"あいうえおあいうえおあいうえお");
	}
}

<出力例>

フィールドの追加

static フィールドはOK、インスタンスフィールドは以下の場所には追加出来ない

equalsのチェックしてみる

equalsなどについては↓
https://zenn.dev/codek2/articles/f16309ae7cb657

package recordTest;

record Item(int id,String name) {}
package recordTest;

public class Main {
	public static void main(String[] args) {
		Item item1=new Item(1,"りんご");
		Item item2=new Item(1,"りんご");

		System.out.println(item1.equals(item2));
	}
}

<出力例>

まとめ

「データを保持するだけのクラス」を作るなら、recordクラスが便利!

https://zenn.dev/codek2/articles/7fbfa22ba62e69

Udemyで講座を公開中!
https://zenn.dev/codek2/articles/e9e44f3e0023fb

X(旧Twitter)
https://twitter.com/kunchan2_

Zenn 本
https://zenn.dev/codek2?tab=books

Youtube
https://www.youtube.com/@codek2_studio

Discussion