Java Record Classes: A Beginner's Guide

こんにちは、未来のJava開発者さん!今日は、Java 14で導入された興味深い機能、Record Classesについて探求していきます。プログラミングが初めての方でも心配しないでください。私はこの概念をステップバイステップに説明します。これまでの教え方と同じように、無数の学生さんにも教えたことがあります。だから、お気に入りの飲み物を片手に、一緒に飛び込んでいきましょう!

Java - Record Classes

Java Recordとは何ですか?

野球カードを収集することを想像してみてください。それぞれのカードには特定の情報があります。選手の名前、チーム、打率です。Javaでは、このようなデータを保持するためにクラスを作成することがよくあります。Recordは、これらのデータを保持するために設計された特別なクラスであり、従来のクラスよりもコードが少なくなります。

Java Recordの目的

Java Recordの主な目的は、データを主に保持するためのクラスの作成を簡素化することです。これは、キッチンで料理を始める前に全ての材料を用意してくれるヘルパーのようなものです。Recordはデータを用意してくれるので、プログラムで使用することに集中できます。

Java Recordの特徴

Recordが特別な理由を見ていきましょう:

  1. 簡潔な構文:より少ないコードでより多くのことを行います!
  2. 不変性:一度作成すると、データは変更できません。
  3. 自動メソッド:Javaが一般的なメソッドを作成します。
  4. 透明性:見たままのものです。隠されたフィールドはありません。

Java Recordを使用しない例

Recordを実際に見る前に、従来のクラスで野球カードを作成してみましょう:

public class BaseballCard {
private final String playerName;
private final String team;
private final double battingAverage;

public BaseballCard(String playerName, String team, double battingAverage) {
this.playerName = playerName;
this.team = team;
this.battingAverage = battingAverage;
}

public String getPlayerName() {
return playerName;
}

public String getTeam() {
return team;
}

public double getBattingAverage() {
return battingAverage;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BaseballCard that = (BaseballCard) o;
return Double.compare(that.battingAverage, battingAverage) == 0 &&
Objects.equals(playerName, that.playerName) &&
Objects.equals(team, that.team);
}

@Override
public int hashCode() {
return Objects.hash(playerName, team, battingAverage);
}

@Override
public String toString() {
return "BaseballCard{" +
"playerName='" + playerName + '\'' +
", team='" + team + '\'' +
", battingAverage=" + battingAverage +
'}';
}
}

すごく多くのコードですね。でも、これだけでもシンプルなものですよね?では、Recordがどのように助けになるのか見ていきましょう。

Java Recordを使用した例

ここに、Recordで実装した同じ野球カードがあります:

public record BaseballCard(String playerName, String team, double battingAverage) {}

それでおしまい!たった一行のコードです。しかし、その単純さに騙されないでください。このRecordは強力です。自動的に以下を作成します:

  • コンストラクタ
  • 各フィールドのゲッターメソッド
  • equals(), hashCode(), toString() メソッド

それでは、新しいRecordを使ってみましょう:

public class BaseballCardDemo {
public static void main(String[] args) {
BaseballCard card = new BaseballCard("Babe Ruth", "New York Yankees", 0.342);

System.out.println(card.playerName());  // 出力: Babe Ruth
System.out.println(card.team());        // 出力: New York Yankees
System.out.println(card.battingAverage()); // 出力: 0.342
System.out.println(card);  // 出力: BaseballCard[playerName=Babe Ruth, team=New York Yankees, battingAverage=0.342]
}
}

見ての通り、通常のクラスと同じようにBaseballCard Recordを作成して使用できますが、コードが大幅に少なくなります!

Java Recordと封印されたインターフェース

Recordはインターフェースも実装できます。封印されたインターフェースも含まれます。封印されたインターフェースは、VIPクラブのように、どのクラスがそのメンバーになれるかを制御します。

以下に例を示します:

public sealed interface Athlete permits BaseballPlayer, BasketballPlayer {}

public record BaseballPlayer(String name, String team) implements Athlete {}
public record BasketballPlayer(String name, String team) implements Athlete {}

public class SportsDemo {
public static void main(String[] args) {
Athlete player1 = new BaseballPlayer("Mike Trout", "Los Angeles Angels");
Athlete player2 = new BasketballPlayer("LeBron James", "Los Angeles Lakers");

System.out.println(player1);  // 出力: BaseballPlayer[name=Mike Trout, team=Los Angeles Angels]
System.out.println(player2);  // 出力: BasketballPlayer[name=LeBron James, team=Los Angeles Lakers]
}
}

この例では、BaseballPlayerBasketballPlayerだけがAthleteインターフェースを実装できます。

Java Recordのメソッドのオーバーライド

Recordは一般的なメソッドの自動実装を提供しますが、必要に応じてオーバーライドすることもできます。以下に例を示します:

public record BaseballCard(String playerName, String team, double battingAverage) {
@Override
public String toString() {
return playerName + " plays for " + team + " with a batting average of " + battingAverage;
}
}

public class BaseballCardDemo {
public static void main(String[] args) {
BaseballCard card = new BaseballCard("Babe Ruth", "New York Yankees", 0.342);
System.out.println(card);  // 出力: Babe Ruth plays for New York Yankees with a batting average of 0.342
}
}

ここでは、toString()メソッドをオーバーライドして、より読みやすい出力を提供しています。

結論

Java Recordは、シンプルでデータに焦点を当てたクラスを最小限のボイラープレートコードで作成するための強力なツールです。それは、野球カードの例で見たように、関連するデータのグループを作成するのに最適です。

プログラミングは楽器を演奏することと似ています。練習が必要です。だから、さあ、異なるタイプのデータ用の独自のRecordを作成してみてください。BookRecordMovieRecordを作成することができます。より多くの練習を重ねることで、この概念に対してより親しみが生まれます。

コードを書き続け、学び続け、最も重要なのは楽しむことです!いつかは、自分のベストセラーのプログラミング書籍用のJava Recordを作成する日が来るかもしれません。大いなる夢を、さらに大きなコードで叶えましょう!

Credits: Image by storyset