LoginSignup
2
2

導入

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で導入されたレコードクラスは、イミュータブルなデータキャリアを簡潔に定義するための強力な機能です。
レコードクラスは、特にデータの一貫性を保つ必要がある場合や、シンプルなデータ構造を扱う場面で非常に役立ちます。

ぜひこの機能を活用してみてください。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2