Khám phá Record trong Java

3:56 29/05/2023

Record trong Java là gì? Các bạn đã hiểu thế nào về Record trong Java? Hãy cùng tìm hiểu ở bài viết này nhé!

Trong Java, việc dùng Class để chứa dữ liệu rất phổ biến, như dữ liệu từ database, dữ liệu gửi từ Http Request, dữ liệu trả về cho Http Response, … Trong các trường hợp như vậy, Class dữ liệu thường được định nghĩa theo cách phổ biến sau:

  • Trường dữ liệu: tương ứng 1-1 với đối tượng dữ liệu cần chứa
  • Phương thức:
    • Constructor: thông thường hàm khởi tạo của các Class dữ liệu được truyền vào toàn bộ các trường của đối tượng
    • Getter: Mỗi trường dữ liệu có một getter tương ứng, ví dụ trường name tương ứng với getter getName()
    • Phương thức so sánh đối tượng equals , dùng để kiểm tra hai đối tượng có chứa dữ liệu giống nhau hoàn toàn hay không
    • Phương thức hashCode, cho phép đối tượng được lưu trong các kiểu Collection như Map và Set.
    • Phương thức toString, cho phép in dữ liệu đối tượng dưới dạng dễ đọc với con người.

Ví dụ, một class để chứa dữ liệu của một học sinh được định nghĩa như sau:

import java.util.Objects;

public class Student {

private final String name;

private final String studentNumber;

public Student(String name, String studentNumber) {

this.name = name;

this.studentNumber = studentNumber;

}

@Override

public int hashCode() {

return Objects.hash(name, studentNumber);

}

@Override

public boolean equals(Object obj) {

if (this == obj) {

return true;

} else if (!(obj instanceof Student)) {

return false;

} else {

Student other = (Student) obj;

return Objects.equals(name, other.name)

&& Objects.equals(studentNumber, other.studentNumber);

}

}

@Override

public String toString() {

return “Student [name=” + name + “, studentNumber=” + studentNumber + “]”;

}

public String getName() {

return name;

}

public String getStudentNumber(){

return studentNumber;

}

}

Cách định nghĩa một Class để chứa dữ liệu theo cách trên rất phổ biến và hay gặp trong các framework như Strut, Spring, Hibernate ,..Tuy nhiên, cách này có nhược điểm là số lượng dòng code để định nghĩa Class thường rất nhiều, một dự án có thể phải định nghĩa hàng trăm Class chứa dữ liệu như vậy, dẫn đến tình trạng dư thừa code một cách không cần thiết.

Record trong Java 14+

Kể từ phiên bản 14 trở đi, Java đưa vào tính năng mới Record, cho phép định nghĩa các đối tượng dữ liệu một cách ngắn gọn, mặc định chứa các phương thức equals, hashCode, toString, hàm khởi tạo đối tượng, các phương thức getter, nên lập trình viên không cần định nghĩa chúng.

Ví dụ, Class Student ở phần phía trên có thể được thay thế bởi một Record như sau:

public record Student (String name, String studentNumber) {}

Để khởi tạo record, sử dụng constructor với đầy đủ các trường dữ liệu được truyền vào:

Student student = new Student(“Nguyễn Văn A”, “10001011”);

Một số lưu ý khi sử dụng Record:

  1. Hàm getter của Record không có tiền tố “get” ở đầu như cách getter thông thường được khai báo:
Student st = new Student(“Nguyen Van A”, “10001”);

System.out.println(st.name());

  1. Có thể định nghĩa thêm các hàm tạo cho Record, tương tự như với Class:
public record Student(String name, String studentNumber) {

public Student(

String firstName,

String lastName,

String studentNumber

){

this(firstName + ” ” + lastName, studentNumber);

}

}

  1. Có thể định nghĩa thêm các phương thức trong Record, tương tự như Class:
public record Student(String name, String studentNumber) {

public void sayHello() {

System.out.println(“Xin chào, tên tôi là ” + name);

}

}

  1. Bên trong các phương thức của Record, không được phép thay đổi giá trị của các trường dữ liệu.
public record Student(String name, String studentNumber) {

public void updateStudentNumber(String newNumber) {

studentNumber = newNumber;

}

}

Đặc điểm trên của Record được gọi là Immutable, nó có nghĩa khi record được tạo ra, các trường dữ liệu sẽ giữ nguyên giá trị trong toàn bộ quá trình sử dụng. Việc này tương đương việc toàn bộ các trường của record được khai báo ở dạng final.

Do có đặc điểm trên Record chỉ  phù hợp để thay thế các Class chứa các đối tượng dữ liệu cố định trong toàn bộ quá trình sử dụng (việc này khá phổ biến với các Class dữ liệu trên thực tế). Nếu cần thay đổi các trường dữ liệu của đối tượng, Record sẽ không phải là lựa chọn phù hợp.

Chúc các bạn học tốt với kiến thức này nhé!

Bộ môn CNTT
Trường Cao đẳng FPT Mạng cá cược bóng đá cơ sở Hà Nội

Cùng chuyên mục

Đăng Kí học Fpoly 2023

Bình Luận