導入
Java 16では新しい言語機能として「レコードクラス」というものが導入されました。
私自身、ほとんどJava8か11のプロジェクトばかりしか触れてこなかったので、きちんと触ったことがなかったのですが、この機能が便利そうでしたので、記事にまとめてみました。
ですので、本記事では、レコードクラスの概要と使用例を紹介していきます。
レコードクラスの概要
レコードクラスは、簡潔にイミュータブルなデータキャリアを定義するための機能です。
古くから利用されているJavaBeansのようなゲッターのみを持つシンプルなクラスを簡潔に定義できます。
これにより、不要なコード(getterメソッド、toString()
、equals()
、hashCode()
メソッドの定義)の明示的な実装を削減することができ、コードの可読性と保守性が向上します。
レコードクラスの定義
レコードクラスは、record
キーワードを使用して定義します。
例は以下のようになります。
record レコードクラス名(型1 引数名1, 型2 引数名2, ...) {}
例えば、Animal
というレコードクラスを作成する場合は、次のようになります。
public record Animal(String species, String habitat, int size) {}
これにより、Animal
クラスは次のようなフィールドを持つイミュータブルクラスとして定義されます。
レコードクラスを使用した場合と使用しなかった場合の比較
Animal
クラスを例にして、レコードクラスを使用した場合と使用しなかった場合のコードを比較します。
レコードクラスを使用した場合
※上記で紹介したものと同じソースです。
レコードクラスを使用すると、Animal
クラスは次のように簡潔に定義できます。
public record Animal(String species, String habitat, int size) {}
レコードクラスを使用しなかった場合
同じAnimal
クラスを通常のJavaクラスとして定義すると、次のようなコードになります。
public final class Animal {
// フィールド
private final String species;
private final String habitat;
private final int size;
// コンストラクタ
public Animal(String species, String habitat, int size) {
this.species = species;
this.habitat = habitat;
this.size = size;
}
// 注: イミュータブル(不変)であるためsetterは存在しません。
// アクセサメソッド(getter)
public String species() {
return species;
}
public String habitat() {
return habitat;
}
public int size() {
return size;
}
@Override
public String toString() {
return "Animal [species=" + species + ", habitat=" + habitat + ", size=" + size + "]";
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Animal animal = (Animal) obj;
return size == animal.size &&
species.equals(animal.species) &&
habitat.equals(animal.habitat);
}
@Override
public int hashCode() {
return Objects.hash(species, habitat, size);
}
}
使用した場合、使用しなかった場合に比べてかなり冗長なコードを削減し、コードの見通しが良くなることが理解できたかと思います。
メソッドのオーバーライドと追加
レコードクラスでも、toString()
やequals()
などのメソッドをオーバーライドしたり、新しいメソッドを追加することができます。
以下の例では、toString()
メソッドをオーバーライドして出力形式をカスタマイズし、printInfo()
メソッドを追加しています。
public record Animal(String species, String habitat, int size) {
@Override
public String toString() {
return "[ 種別 => " + species + ", 生息地 => " + habitat + ", 大きさ => " + size + " ]";
}
public void printInfo() {
String message = "この動物は「" + species + "」です。" + habitat + "に生息しており、大きさは" + size + " cm あるとされています。";
System.out.println(message);
}
}
終わりに
Java 16で導入されたレコードクラスは、イミュータブルなデータキャリアを簡潔に定義するための強力な機能です。
レコードクラスは、特にデータの一貫性を保つ必要がある場合や、シンプルなデータ構造を扱う場面で非常に役立ちます。
ぜひこの機能を活用してみてください。