【Java】recordの使用方法

本稿ではJava16で正式に追加されたrecordについて使用方法を確認していこうと思います。

recordの機能を使うと、値の変更が不可能なクラスを簡単に作成できます。

定義コードはこれだけです。

record Rec(int i, int j) {}

利用サンプル


record Rec(int i, int j) {}

public class Test {

	public static void main(String[] args) {
		Rec r1 = new Rec(10, 100);
		Rec r2 = new Rec(50, 200);
		Rec r3 = new Rec(10, 100);

		System.out.println("-----------------状態の確認-----------------");
		System.out.println("r1は"+r1);
		System.out.println("r2は"+r2);
		System.out.println("r3は"+r3);
		System.out.println("-----------------状態の確認-----------------");

		System.out.println("-----------------equalsの確認-----------------");
		if ( r1.equals(r2) ) {
			System.out.println("r1とr2の状態は同じです。");
		}
		if ( r1.equals(r3) ) {
			System.out.println("r1とr3の状態は同じです。");
		}
		System.out.println("-----------------equalsの確認-----------------");
		
		System.out.println("-----------------定義メソッドの呼び出し-----------------");
		System.out.println(r2.i());
		System.out.println(r2.j());
		System.out.println("-----------------定義メソッドの呼び出し-----------------");
	}

}
実行結果

===========状態の確認===========
r1はRec[i=10, j=100]
r2はRec[i=50, j=200]
r3はRec[i=10, j=100]
===========状態の確認===========
===========equalsの確認===========
r1とr3の状態は同じです。
===========equalsの確認===========
===========定義メソッドの呼び出し===========
50
200
===========定義メソッドの呼び出し===========

結果から見てもわかる通り、値設定や特定のメソッドを自動定義してくれています。

record Rec(int i, int j) {}

上記の定義は下記のようなクラスを宣言したようなものとして扱われます。

class Rec extends Record {
	  // 状態がprivate finalとして定義
	  private final int i;
	  private final int j;
	  // 追加のインスタンスフィールドは定義できない

	  // 状態をフィールドに設定するコンストラクタが定義される
	  public Rec(int i, int j) {
	    this.i = i;
	    this.j = j;
	  }

	  // 状態と同じ名前のメソッドが定義される
	  public int i() {
	    return i;
	  }
	  public int j() {
	    return j;
	  }

	  // 状態を反映するhashCodeが定義される
	  public int hashCode() { ... }
	  // 状態を比較するequals が定義される
	  public boolean equals() { ... }
	  // 状態を表示するtoStringが定義される
	  public String toString() { ... }
}

使いどころとしては値の一時セットを作るためのクラスとして使ったり変更できない構造体を作りたいときに使用する機会がありそうです。

私の場合、元のクラスの構造を弄らずにデータ同士の紐付けを表現したい状況が結構あったりするんで、わりと重宝しそうです。データベースとか使っていると結構そういう状況ありそうですよね。

ゲームで使うとしたらあまり用途が浮かびませんが、キャラクターが持ってるアイテムを表したものを一時的に補完する用途とかになるかなぁ・・・

試しにrecordを使ってキャラが持っているアイテムを表現したコードを書いてみました。

import java.util.Arrays;
import java.util.List;

public class Test {

	public static void main(String[] args) {
		//キャラクター定義
		Chara ch1 = new Chara("マリオ",100);
		Chara ch2 = new Chara("クッパ",500);
		Chara ch3 = new Chara("ピーチ",10);
		
		//アイテム定義
		Item itm1 = new Item("スター");
		Item itm2 = new Item("フラワー");

		//キャラが持っているアイテムを紐付けるrecordの定義
		record CharaItem(Chara chara, List<Item> item) {}

		//紐付け
		CharaItem ci1 = new CharaItem(ch1, List.of(itm1, itm2));
		CharaItem ci2 = new CharaItem(ch2, List.of(itm2));
		CharaItem ci3 = new CharaItem(ch3, List.of());

		//キャラクターが持っているアイテムを表示
		Arrays.asList(ci1,ci2,ci3).stream().forEach(System.out::println);
	}

}
//キャラクタークラス
class Chara {
	  String name;
	  int hp;
	  Chara(String name, int hp){
		  this.name = name;
		  this.hp = hp;
	  }
	  public String toString() {
		  return name;
	  }
}
//アイテムクラス
class Item {
	  String name;
	  Item(String name){
		  this.name = name;
	  }
	  public String toString() {
		  return name;
	  }
}
実行結果

CharaItem[chara=マリオ, item=[スター, フラワー]]
CharaItem[chara=クッパ, item=[フラワー]]
CharaItem[chara=ピーチ, item=[]]

参考サイト様
https://qiita.com/nowokay/items/215769cdcb14d6c5412f

Java

Posted by nompor