Lớp Record Java: Hướng Dẫn Cho Người Mới Bắt Đầu

Xin chào các bạn, những nhà phát triển Java tương lai! Hôm nay, chúng ta sẽ khám phá một tính năng thú vị được giới thiệu trong Java 14: Lớp Record. Đừng lo nếu bạn mới bắt đầu học lập trình – tôi sẽ hướng dẫn bạn qua khái niệm này bước từng bước, đúng như tôi đã làm cho nhiều học viên khác trong những năm dạy học. Vậy hãy lấy ly cà phê yêu thích của bạn, và hãy bắt đầu探索nào!

Java - Record Classes

Lớp Record Java là gì?

Hãy tưởng tượng bạn đang thu thập các thẻ bóng chày. Mỗi thẻ có thông tin cụ thể: tên cầu thủ, đội, và tỷ lệ đánh bóng. Trong Java, chúng ta thường tạo ra các lớp để giữ các kiểu dữ liệu như vậy. Một Record là một loại lớp đặc biệt được thiết kế để chỉ làm việc đó – giữ dữ liệu – nhưng với nhiều mã ít hơn so với các lớp truyền thống.

Mục đích của Lớp Record Java

Mục đích chính của một Lớp Record Java là đơn giản hóa việc tạo ra các lớp mà chủ yếu được sử dụng để lưu trữ dữ liệu. Nó như có một người giúp việc trong bếp nấu chín tất cả các nguyên liệu trước khi bạn bắt đầu nấu – Records sẽ chuẩn bị dữ liệu của bạn để bạn có thể tập trung vào việc sử dụng nó trong chương trình của mình.

Tính Năng của Lớp Record Java

Hãy xem những gì làm cho Records trở nên đặc biệt:

  1. Cú pháp ngắn gọn: Viết ít hơn, làm nhiều hơn!
  2. Không thể thay đổi: Khi được tạo ra, dữ liệu không thể thay đổi.
  3. Phương thức tự động: Java tạo ra các phương thức phổ biến cho bạn.
  4. Minh bạch: Những gì bạn thấy là những gì bạn nhận được – không có trường ẩn.

Ví dụ Không Sử Dụng Lớp Record Java

Trước khi chúng ta thấy Record hoạt động, hãy tạo một lớp truyền thống cho thẻ bóng chày của chúng ta:

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

Ôi! Đó là nhiều mã với một điều gì đó đơn giản phải không? Bây giờ, hãy xem Records có thể giúp chúng ta như thế nào.

Ví dụ Sử Dụng Lớp Record Java

Dưới đây là cùng một thẻ bóng chày được triển khai như một Record:

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

Đó là nó! Chỉ một dòng mã. Nhưng đừng để đơn giản của nó lừa bạn – Record này mang lại một đòn tấn công mạnh mẽ. Nó tự động tạo ra:

  • Một khởi tạo
  • Các phương thức getter cho mỗi trường
  • Các phương thức equals(), hashCode(), và toString()

Hãy sử dụng Record mới của chúng ta:

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());  // Xuất: Babe Ruth
System.out.println(card.team());        // Xuất: New York Yankees
System.out.println(card.battingAverage()); // Xuất: 0.342
System.out.println(card);  // Xuất: BaseballCard[playerName=Babe Ruth, team=New York Yankees, battingAverage=0.342]
}
}

Như bạn có thể thấy, chúng ta có thể tạo và sử dụng BaseballCard Record như một lớp thường, nhưng với nhiều mã ít hơn!

Lớp Record Java cho Giao diện Đóng băng

Records cũng có thể thực hiện các giao diện, bao gồm các giao diện đóng băng. Một giao diện đóng băng như một câu lạc bộ VIP – nó kiểm soát những lớp nào có thể là thành viên của nó.

Dưới đây là một ví dụ:

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);  // Xuất: BaseballPlayer[name=Mike Trout, team=Los Angeles Angels]
System.out.println(player2);  // Xuất: BasketballPlayer[name=LeBron James, team=Los Angeles Lakers]
}
}

Trong ví dụ này, chỉ BaseballPlayerBasketballPlayer mới được phép thực hiện giao diện Athlete.

Ghi đè Phương thức của Lớp Record Java

Mặc dù Records cung cấp các triển khai tự động của các phương thức phổ biến, bạn vẫn có thể ghi đè chúng nếu cần. Dưới đây là một ví dụ:

public record BaseballCard(String playerName, String team, double battingAverage) {
@Override
public String toString() {
return playerName + " chơi cho " + team + " với tỷ lệ đánh bóng là " + 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);  // Xuất: Babe Ruth chơi cho New York Yankees với tỷ lệ đánh bóng là 0.342
}
}

Ở đây, chúng ta đã ghi đè phương thức toString() để cung cấp một đầu ra dễ đọc hơn.

Kết Luận

Lớp Record Java là một công cụ mạnh mẽ để tạo ra các lớp đơn giản, tập trung vào dữ liệu với ít mã bổ sung. Chúng hoàn hảo cho khi bạn cần nhóm các mảnh dữ liệu liên quan lại với nhau, như trong ví dụ thẻ bóng chày của chúng ta.

Hãy nhớ, lập trình như học cách chơi một cây đàn – cần nhiều tập luyện. Vì vậy, hãy thử tạo ra các Record riêng của bạn cho các loại dữ liệu khác nhau. Có lẽ bạn có thể tạo một BookRecord hoặc một MovieRecord. Càng tập luyện nhiều, bạn sẽ cảm thấy thêm thoải mái với khái niệm này.

Hãy tiếp tục mã hóa, tiếp tục học hỏi, và nhất quan trọng là hãy vui vẻ! Ai biết, có lẽ một ngày nào đó bạn sẽ tạo ra một Lớp Record Java để lưu trữ dữ liệu về cuốn sách lập trình best-seller của riêng bạn. Đơm lớn, mã lớn hơn!

Credits: Image by storyset