Trước khi đi vào bài viết, gửi tới các bạn lời chúc sức khỏe cho một năm mới 2024 thật cháy với ngọn lửa học tập, công việc vừa ý, túi tiền nặng ký nhé ♥️😘
Cùng với sự phổ biến ngày càng tăng của Java, việc giảm lặp mã và làm cho mã nguồn trở nên gọn gàng là mối quan tâm hàng đầu của các nhà phát triển. Trong thế giới này, Lombok là một công cụ mạnh mẽ, giúp chúng ta viết mã ít lặp hơn và tăng tính dễ bảo trì. Trong bài viết này, chúng ta sẽ khám phá 16 annotations phổ biến của Lombok, cung cấp một cái nhìn tổng quan về cách chúng giúp tối ưu hóa mã nguồn Java.
Hãy cùng mình tổng hợp lại và xem các bạn đã biết và đang sử dụng được bao nhiêu trong số đó nhé.
A. Khái niệm
Lombok là một thư viện Java nhẹ được thiết kế để giảm lặp mã và tăng cường tính dễ bảo trì của mã nguồn.
Thư viện này giúp giảm việc phải viết các phương thức standard như getters, setters, constructors, toString(), equals(), và hashCode(), ... bằng cách sử dụng các annotation. Khi sử dụng Lombok, bạn có thể tập trung vào logic chính của ứng dụng mà không phải lo lắng và mất thời gian vào việc viết mã lặp lại không cần thiết vì lombok sẽ giúp chúng ta làm điều này
Bài viết này chúng ta sẽ tìm hiểu 16 annotations mà Lombok cung cấp và một cách nhanh chóng để sử dụng chúng.
B. Nội dung chính
1. @NotNull
Bạn có thể sử dụng @NonNull trên các trường (field) hoặc tham số của phương thức hoặc constructor. Điều này sẽ khiến lombok tạo ra một kiểm tra null cho bạn.
Ngoài ra nếu bạn sử dụng nó để chú thích trên một trường. việc kiểm tra sẽ được thêm vào constructor và setter method
2. @Getter & @Setter
- Có lẽ đây là 2 trong số những annotations phổ biến nhất của Lombok, được sử dụng để tự động tạo getters và setters cho tất cả các trường
3. @ToString
Chú thích này sẽ ghi đè phương thức toString() để dễ dàng gỡ lỗi. Kết quả là trạng thái hiện tại của đối tượng sẽ được trả về dưới dạng String khi toString() được gọi
4. @EqualsAndHashCode
Annotation @EqualsAndHashCode trong Lombok được sử dụng để tự động tạo các phương thức equals() và hashCode() cho một lớp dựa trên các trường đã được đánh dấu.
Nếu bạn muốn xác định các trường cụ thể được sử dụng để tạo equals() và hashCode(), bạn có thể chỉ định chúng trong annotation như sau:
5.@NoArgsConstructor & @AllArgsConstructor
Chúng ta có thể dễ dàng tạo các hàm constructor của lớp bằng Lombok: nếu muốn một hàm constructor nhận tất cả các trường, chúng ta chỉ cần chú thích lớp bằng @AllArgsConstuructor. Mặt khác, nếu chúng ta cần constructor mặc định không có đối số , chúng ta cũng cần thêm @NoArgsConstructor.
6. @RequiredArgConstructor
Giúp tự động tạo constructor chứa tham số cho các trường (fields) được khai báo với final hoặc @NonNull
Lombok @RequiredArgsConstructor sẽ không sinh các tham số trong constructor đối với các thuộc tính:
- Non-final
- Thuộc tính final đã được khởi tạo
- Thuộc tính static
- Các thuộc tính @NonNull đã được khởi tạo
Như bạn thấy trong ví dụ, hàm khởi tạo được sinh tự động cho class RequiredArgsDemo2 là rỗng do các thuộc tính của lớp nằm trong 4 trường hợp mình kể trên.
7. @Data
Khi bạn sử dụng @Data nó sẽ tương đương với việc bạn đang sử dụng @Getters, @Setters, @ToString, @EqualsAndHashCode và @RequiredArgsConstructor
8. @Value
Giúp chúng ta tự động tạo các phương thức getter, equals, hashCode, và toString cho tất cả các trường của lớp, đồng thời đánh dấu lớp là không thể thay đổi (immutable). Các trường có thể là final hoặc không cần phải là final - tức là nếu có một trường bạn không đánh dấu là final thì nó cũng sẽ được tự coi là final
Trong trường hợp này, Lombok sẽ tạo các phương thức getter cho firstName, lastName, và age, cũng như phương thức equals, hashCode, và toString. Ngoài ra, tất cả các trường đều được coi là final, làm cho đối tượng trở nên không thể thay đổi (immutable).
Thêm một điều nữa cho các bạn, là trong phiên bản Java 16, sử dụng Record để có thể làm điều này sẽ là cách tốt hơn và được khuyến nghị hơn. Cú pháp của nó như sau:
Có nhiều lí do để Record được khuyến nghị sử dụng hơn là Lombok trong vấn đề này theo mình bởi 2 lí do chính sau:
- Record được hỗ trợ chính thức từ Java, điều này giúp chúng ta giảm sự phụ thuộc của bên thứ 3 (ở đây chính là Lombok), tăng tính chặt chẽ và ổn định của code.
- Khả năng tương thích IDE: Lombok dựa vào việc tạo code tại thời điểm biên dịch, điều này không phải lúc nào cũng sẽ hoạt động tốt với tất cả các IDE. Một số IDE có thể không hỗ trợ đầy đủ tính năng của Lombok.
9. @Builder
Annotation @Builder trong Lombok giúp chúng ta triển khai builder design pattern cho các lớp, giúp dễ dàng xây dựng đối tượng với nhiều trường một cách linh hoạt. Điều này đôi khi cực kỳ hữu ích, đặc biệt nếu một số trường có giá trị rỗng
10. @SneakyThrows
@SneakyThrows là một annotation trong dự án Lombok, và nó giúp giảm bớt code khi bạn đang xử lý checked exceptions. Checked exceptions là các exceptions mà compiler buộc bạn phải xử lý bằng cách sử dụng khối try-catch hoặc báo rằng phương thức có thể ném ra ngoại lệ đó bằng cách sử dụng từ khóa throws.
Khi bạn sử dụng @SneakyThrows, Lombok sẽ tự động thêm vào mã nguồn các khối try-catch cho checked exceptions, giúp giảm bớt sự lặp lại và làm mã nguồn trở nên ngắn gọn hơn.
Lưu ý rằng @SneakyThrows thường được sử dụng khi bạn muốn giảm bớt boilerplate code và khi bạn chắc chắn rằng việc ném ngoại lệ là một tình huống không mong muốn mà bạn không thể xử lý logic của mình một cách hợp lý. Tuy nhiên, cần cẩn trọng khi sử dụng @SneakyThrows, vì nó có thể ẩn đi các thông báo lỗi và làm cho mã nguồn trở nên khó hiểu hơn.
11. @Synchronized
Annotation này sẽ tự động thêm khối synchronized cho các phương thức, giúp đảm bảo rằng chỉ một luồng (thread) có thể thực hiện phương thức đó tại một thời điểm. Điều này giúp tránh tình trạng đọc/ghi đồng thời (concurrent read/write) và giúp bảo vệ tài nguyên được chia sẻ.
12. @With
@With là được sử dụng để tạo ra các phương thức "with" tự động cho các trường của một lớp. Các phương thức "with" này giúp bạn tạo ra một bản sao mới của đối tượng với giá trị thay đổi cho một hoặc nhiều trường, giữ nguyên giá trị của các trường khác. Điều này giúp thực hiện các thay đổi trên đối tượng mà không làm thay đổi đối tượng gốc.
Trong ví dụ này:
-
Lombok tự động tạo phương thức withAddress(String newAddress) cho trường address.
-
Bạn có thể sử dụng phương thức withAddress để tạo một bản sao mới của đối tượng Person với địa chỉ mới, giữ nguyên các giá trị khác không thay đổi.
13. @Log
Annotation này được sử dụng để tự động tạo các biến logger cho một lớp hoặc một trường logger cho mỗi lớp.
Khi bạn sử dụng @Log, một trường logger có tên là log sẽ được tự động thêm vào lớp. Logger này sử dụng java.util.logging (JUL), là một phần của Java Logging API.
Lombok cũng cung cấp các annotation tương tự như @Log cho các thư viện logging khác như SLF4J (@Slf4j) và Log4j (@Log4j, @Log4j2), giúp tùy chọn logging phù hợp với dự án của bạn
14.@Cleanup
@Cleanup là một annotation trong Lombok được sử dụng để tự động giải phóng nguồn tài nguyên, chẳng hạn như đóng các luồng (Closeable, AutoCloseable), giải phóng bộ nhớ (@Cleanup("dispose")), hoặc thực hiện các công việc giải phóng tài nguyên tùy chỉnh thông qua phương thức được chỉ định. Nó sẽ tương tự như khối try-with-resources.
Hoặc:
Trong ví dụ này, @Cleanup("dispose") sẽ gọi phương thức dispose() của đối tượng MyResource khi kết thúc khối try.
Trong đó MyRéource là một đối tượng giả định, và nó có thể là bất kỳ loại đối tượng nào mà bạn muốn thực hiện việc giải phóng tài nguyên khi sử dụng @Cleanup. Trong thực tế, đối tượng này có thể là một đối tượng cần đóng kết nối database, giải phóng bộ nhớ, đóng luồng, hoặc thực hiện các công việc giải phóng tài nguyên tùy chỉnh.
C. Kết luận
Với 16 annotation này, Lombok không chỉ giúp chúng ta viết mã nhanh chóng mà còn giảm bớt những công đoạn lặp lại. Sử dụng chúng có thể làm cho mã nguồn của bạn trở nên ngắn gọn hơn và dễ bảo trì hơn. Tuy nhiên, nhớ rằng sự tiện ích cần đi đôi với sự hiểu biết, và việc sử dụng Lombok cần phải được thực hiện một cách cẩn thận để tránh những hiểu lầm không mong muốn.