Java Silver SE 17の学習をする中でレコードクラスについて初めて学んだので、理解の整理も兼ねてまとめてみました。
試験を受ける方やレコードクラスの概要を把握したい方のお役に立てたら幸いです!
1.レコードクラスとは
レコードクラスは主にデータを保持するためのクラスで、Java 16から正式採用されました。クラスに「record」を付けることでレコードクラスとして使用できます。レコードクラスの主な目的は、不変性の確保やコードの可読性・保守性の向上にあります。レコードクラスが導入される前はデータを保持するクラスを記述する際、コードが冗長になりがちで可読性が低くなるとともに、自分で書く必要があるのでミスが起こる可能性も低くありませんでした。そこでレコードクラスを用いることで簡潔で安全なプログラムの実装が容易になります。
2.実際の使い方
まず、レコードクラスが導入される以前では、フィールドを持つクラスを定義する際は下記のように手動で記述する必要がありました。
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && name.equals(person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Person[name=" + name + ", age=" + age + "]";
}
}
一方、レコードクラスは下記のように定義します。
public record Person(String name, int age) {}
この記述をするだけで以下の5つが自動で追加され、手動で記述する必要がなくなりました。
- フィールドの値を返すgetterメソッド
- フィールドを引数にとるpublicなコンストラクタ
- toStringメソッド
- hashCodeメソッド
- equalsメソッド
コード量がかなり減っていることが一目瞭然だと思います。コードが自動で追加されるので記述ミスもしづらくなります。
下記がレコードクラスの使用例になります。
public class Sample {
public static void main(String[] args) {
Person p1 = new Person("Taro", 20);
Person p2 = new Person("Jiro", 30);
System.out.println(p1.name()); // → Taro
System.out.println(p2.age()); // → 30
}
}
3.レコードクラスを使用する上での注意点
便利なレコードクラスですが、いくつか注意すべき点もございます。
レコードクラスは継承できない
レコードクラスは暗黙的にfinalがつくため、継承は不可になります。
フィールドの値は変更できない
レコードクラスのフィールドはprivate finalとして自動的に定義されるため、値の変更を行うことができません。フィールドを変更するコードを記述するとコンパイルエラーになります。これは不変性の確保を目的としているためです。
フィールドの値を取得する方法
レコードクラスではgetterが自動生成されますが、従来のgetName()のようなメソッド名ではなく、フィールド名と同じ名前でメソッドが自動生成されます。そのため、例えばレコードクラスの引数にあるnameの値を取得する際は従来のインスタンス名.getName()
ではなく、使用例にも記載があるインスタンス名.name()
で値を取得します。また、getterとセットとしてよく使われるsetterに関してはレコードクラスでは生成されません。(こちらも不変性の確保のためです。)
4.最後に
レコードクラスはコード量が格段に減るので、使うべき場面では積極的に利用しようと思いました。
また、レコードクラスはJava Silver SE 17から新たに追加された項目でもあり試験でも問われやすい内容になっているので、しっかりと対策をする必要があると感じました。
内容としては以上になります。
最後まで読んでいただきありがとうございました!
参考
- 志賀 澄人,「徹底攻略Java SE 17 Silver問題集[1Z0-825]対応」, インプレス, 2024年10月
- 中山 清喬,「スッキリわかるJava入門 実践編 第4版」, インプレス, 2024年2月