Java記錄類別:初學者指南

你好,未來的Java開發者!今天,我們將要探索Java 14引入的一個令人興奮的功能:記錄類別。如果你是编程新手,別擔心——我會一步一步引導你理解這個概念,就像我在多年教學中為無數學生所做的那樣。所以,拿起你最喜歡的飲料,我們一起深入探討吧!

Java - Record Classes

什麼是Java記錄?

想象你正在收集棒球卡牌。每張卡牌都有特定的信息:球員的名稱、球隊和打擊率。在Java中,我們經常創建類別來保存這種數據。記錄是一種特殊的類別,設計用來做這件事——保存數據——但代碼遠少於傳統類別。

Java記錄的用途

Java記錄的主要目的是简化主要用于存儲數據的類別的創建。這就像廚房裡有一個助手,在你開始烹飪之前為你準備所有食材——記錄為你準備數據,讓你可以專注於在程序中使用它。

Java記錄的功能

讓我們看看記錄有哪些特別之處:

  1. 簡潔的語法:寫得少,做得多!
  2. 不可變性:一旦創建,數據就不能更改。
  3. 自動方法:Java為你創建常用方法。
  4. 透明性:你所見即所得——沒有隱藏的字段。

不使用Java記錄的示例

在我們看到記錄的實際應用之前,讓我們為我們的棒球卡牌創建一個傳統類別:

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 +
'}';
}
}

哇!這麼簡單的事情要寫這麼多代碼,對吧?現在,讓我們看看記錄如何幫助我們。

使用Java記錄的示例

這裡是我們的棒球卡牌作為記錄的實現:

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

就這樣!只有一行代碼。但不要被它的簡潔迷惑——這個記錄充滿了力量。它自動創建:

  • 一個構造函數
  • 每個字段的getter方法
  • equals(), hashCode()toString() 方法

讓我們使用我們的新記錄:

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記錄,但代碼少得多!

Java記錄和密封接口

記錄也可以實現接口,包括密封接口。密封接口就像一個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記錄的方法

雖然記錄提供了常用方法的自動實現,但如果你需要,仍然可以覆蓋它們。這裡有一個例子:

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記錄是創建簡單、以數據為中心的類別的強大工具,代碼最少。它們非常適合當你需要將相關的數據片段組合在一起時,就像我們的棒球卡牌示例一樣。

記住,編程就像學習演奏樂器——需要練習。所以,嘗試為不同類型的數據創建自己的記錄,例如BookRecordMovieRecord。你練習得越多,對這個概念就越熟悉。

繼續編程,繼續學習,最重要的是,玩得開心!誰知道,也許有一天你會創建一個Java記錄來存儲關於你自己暢銷编程書的數據。夢想大,代碼更大!

Credits: Image by storyset