Record class trong Java
Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh
Trong Java, khái niệm immutable dùng để chỉ những class mà đối tượng của chúng không bị thay đổi thông tin sau khi được khởi tạo.
Bình thường, để khai báo một immutable class, chúng ta sẽ:
Khai báo class này là final để không class nào extend được từ nó.
- Khai báo các fields của class đó là private và final,
- Không có các phương thức Setter mà chỉ có các phương thức Getter,
- Nếu một trong các fields của class đó là object thì khi lấy thông tin của field đó, chúng ta cần return copy của object đó.
Ví dụ, nếu mình cần implement class Student với 2 thuộc tính là tên và tuổi, là immutable class, mình sẽ khai báo như sau:
package com.huongdanjava.javaexample; public final class Student { private final String name; private final int age; public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } }
Mình đã giới thiệu với các bạn về Project Lombok, về lợi ích của nó trong việc giảm thiểu việc viết code cho những phương thức Getter, hay constructor, … khi khai báo một class. Với immutable class Student ở trên, chúng ta có thể viết lại với Project Lombok như sau:
package com.huongdanjava.javaexample; import lombok.AllArgsConstructor; import lombok.Getter; @Getter @AllArgsConstructor public final class Student { private final String name; private final int age; }
Từ Java 14 trở đi, chúng ta có thể làm điều này nhanh hơn rất nhiều, đơn giản hơn rất nhiều, không cần sử dụng Project Lombok nữa, bằng cách sử dụng từ khoá record khi khai báo class. Giờ thì chúng ta chỉ cần 1 dòng code để implement immutable class Student ở trên, như sau:
package com.huongdanjava.javaexample; public record Student(String name, int age) {}
Java compiler sẽ generate các private, final fields, public constructor với đầy đủ các fields (constructor này còn được gọi là canonical constructor), các phương thức Getter cho những field này, phương thức equals(), phương thức hashCode() và phương thức toString() khi chúng ta sử dụng record để khai báo một class. Đối tượng của những class này sẽ là các đối tượng immutable các bạn nhé!
Giờ thì các bạn có thể khởi tạo và lấy thông tin của một đối tượng Student như sau:
Chúng ta không thể extend class Student này:
bởi vì class Student này là final class.
Các bạn có thể khai báo thêm các constructor khác cho class Student này theo nhu cầu của mình, ví dụ như default constructor hay constructor có 1 tham số, như sau:
package com.huongdanjava.javaexample; public record Student(String name, int age) { public Student() { this("Khanh", 35); } public Student(String name) { this(name, 0); } }
Chúng ta cũng có thể khai báo các static variable và static method bên trong một record class:
package com.huongdanjava.javaexample; public record Student(String name, int age) { public static String NAME = "Huong Dan Java"; public static void doSomething() { System.out.println("Hello"); } }
và gọi đến chúng, ví dụ như sau:
Bài viết gốc được đăng tải tại huongdanjava.com
Bạn có thể quan tâm:
- Senior & Junior Java Dev – điều gì làm nên sự khác biệt
- Top 5 câu hỏi phỏng vấn java hay nhất
- Java Enum là gì?. Tại sao nên sử dụng enum?
Xem tin tuyển dụng CNTT mới nhất trên TopDev
- T Từ khóa final trong Java
- R RxJava – Thời đại lập trình Reactive programming ứng dụng Android đã tới
- J Java roadmap cho newbie – Từ số 0 đến chuyên nghiệp
- T Top các Framework Java Backend phổ biến cho anh em Developer
- T Tìm hiểu về lớp HashMap trong Java: Các hoạt động và cách dùng
- L Lập trình Android bằng Java: Hướng dẫn toàn diện
- J Java Super là gì? Sự khác biệt giữa Java Super và Java thông thường
- K Khai báo phương thức overloading trong Java
- J Java Sleep: Kỹ thuật ngủ luồng trong lập trình Java
- S Sử dụng subString trong xử lý văn bản trong Java