💡
【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などについては↓
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クラスが便利!
Udemyで講座を公開中!
X(旧Twitter)
Zenn 本
Youtube
Discussion