【Java】レコードクラスについて
Javaのレコードクラスについて、特徴、使い方、メリット、制約、実例などを詳しく解説します。
以下の各見出しから、興味のある内容にジャンプできます。
レコードクラスとは
レコードクラスは、Java 14(プレビュー機能として導入)およびJava 16(正式機能として導入)で導入された、データを簡潔に表現するためのクラスです。主にイミュータブルなデータキャリアとして利用され、フィールド、コンストラクタ、アクセサーメソッド、toString()
、equals()
、hashCode()
が自動生成されます。
レコードクラスの特徴
レコードクラスには以下のような特徴があります。
- イミュータブルなデータ構造:レコードクラスのフィールドはデフォルトでfinalです。
- 自動生成されるメソッド:
toString()
、equals()
、hashCode()
が自動的に生成されます。 - 簡潔な構文:宣言が短く、読みやすいコードを実現します。
- フィールドのリストが重要:コンストラクタやアクセサーメソッドもフィールドに基づいて生成されます。
レコードクラスのメリット
レコードクラスを使用することで、以下のようなメリットがあります。
- ボイラープレートコードの削減:データ保持用クラスでの定型的なコードを記述する手間が省けます。
- 可読性の向上:クラス宣言が簡潔で、意図が明確になります。
- イミュータブルデータの安全性:変更不可なデータモデルを簡単に作成できます。
レコードクラスの例
以下に具体的な使用例を示します。
基本的なレコードクラスの定義
public record Point(int x, int y) {}
上記の定義では、以下のメソッドが自動生成されます:
int x()
:x
フィールドの値を返すint y()
:y
フィールドの値を返すString toString()
:"Point[x=値, y=値]"
形式の文字列を返すboolean equals(Object o)
int hashCode()
レコードクラスのインスタンス作成
Point point = new Point(3, 5);
System.out.println(point); // 出力: Point[x=3, y=5]
カスタマイズしたメソッド
レコードクラスに独自のメソッドを追加することも可能です。
public record Circle(Point center, double radius) {
public double area() {
return Math.PI * radius * radius;
}
}
使用例:
Circle circle = new Circle(new Point(0, 0), 5);
System.out.println(circle.area()); // 出力: 78.53981633974483
カスタムコンストラクタの利用
コンストラクタをカスタマイズすることも可能です。
public record Rectangle(int width, int height) {
public Rectangle {
if (width <= 0 || height <= 0) {
throw new IllegalArgumentException("幅と高さは正の数である必要があります。");
}
}
}
レコードクラスの制約
レコードクラスには以下のような制約があります。
- イミュータブルである必要がある:フィールドは
final
で、再代入できません。 - 継承不可:レコードクラスは他のクラスを継承できず、また継承されることもありません。
- 状態の管理が制限される:複雑なロジックや可変状態を持つオブジェクトには適しません。
まとめ
レコードクラスは、データキャリアとしての用途に非常に適しており、シンプルで可読性の高いコードを実現します。ただし、イミュータブル性や継承の制約があるため、用途に応じた使い分けが必要です。