Java记录类:初学者指南

你好,未来的Java开发者!今天,我们将探讨Java 14引入的一个激动人心的特性:记录类(Record Classes)。如果你是编程新手,也不用担心——我会一步一步引导你理解这个概念,就像我在多年教学中对无数学生所做的那样。所以,拿起一杯你最喜欢的饮料,让我们开始吧!

Java - Record Classes

什么是Java记录?

想象你在收集棒球卡牌。每张卡牌都有特定的信息:球员的名字、球队和击球平均值。在Java中,我们经常创建类来保存这类数据。记录(Record)是一种特殊的类,设计用来保存数据——但比传统类需要少得多的代码。

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("贝比·鲁斯", "纽约洋基队", 0.342);

System.out.println(card.playerName());  // 输出:贝比·鲁斯
System.out.println(card.team());        // 输出:纽约洋基队
System.out.println(card.battingAverage()); // 输出:0.342
System.out.println(card);  // 输出:BaseballCard[playerName=贝比·鲁斯, team=纽约洋基队, 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("迈克·特劳特", "洛杉矶天使队");
Athlete player2 = new BasketballPlayer("勒布朗·詹姆斯", "洛杉矶湖人队");

System.out.println(player1);  // 输出:BaseballPlayer[name=迈克·特劳特, team=洛杉矶天使队]
System.out.println(player2);  // 输出:BasketballPlayer[name=勒布朗·詹姆斯, team=洛杉矶湖人队]
}
}

在这个例子中,只有BaseballPlayerBasketballPlayer允许实现Athlete接口。

重写Java记录的方法

尽管记录提供了常见方法的自动实现,但如果你需要,仍然可以重写它们。以下是一个例子:

public record BaseballCard(String playerName, String team, double battingAverage) {
@Override
public String toString() {
return playerName + " 为 " + team + " 打球,击球平均值为 " + battingAverage;
}
}

public class BaseballCardDemo {
public static void main(String[] args) {
BaseballCard card = new BaseballCard("贝比·鲁斯", "纽约洋基队", 0.342);
System.out.println(card);  // 输出:贝比·鲁斯 为 纽约洋基队 打球,击球平均值为 0.342
}
}

在这里,我们重写了toString()方法,以提供更易读的输出。

结论

Java记录是创建简单、以数据为中心的类并最小化样板代码的强大工具。它们非常适合于当你需要将相关的数据片段组合在一起时,比如我们的棒球卡牌示例。

记住,编程就像学习演奏乐器——需要练习。所以,尝试为你不同类型的数据创建自己的记录。也许可以创建一个BookRecordMovieRecord。你练习得越多,对这个概念就会越熟悉。

继续编码,继续学习,最重要的是,玩得开心!谁知道呢,也许有一天你会创建一个Java记录来存储关于你自己的畅销编程书籍的数据。大胆梦想,更大胆编码!

Credits: Image by storyset