Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu @Cleanup annotation của lombok. Ngoài ra chúng ta cũng sẽ cùng nhau thảo luận về việc sử dụng @Cleanup và try-with-resource.
@Cleanup annotation dùng để làm gì?
@Cleanup annotation được dùng để quản lý các tài nguyên một cách tự động. Nó sẽ giúp chúng ta gọi hàm close() để đóng các tài nguyên sau khi sử dụng xong.
Giả sử chúng ta sử dụng @Cleanup để chú thích một InputStream
@Cleanup InputStream in = new FileInputStream("some/file");
Lombok sẽ chịu trách nhiệm sinh thêm các đoạn code nhầm đảm bảo in được đúng cách bằng cách gọi in.close().
Ví dụ đầy đủ với đoạn code sau
import lombok.Cleanup; import java.io.*; public class CleanupExample { public static void main(String[] args) throws IOException { @Cleanup InputStream in = new FileInputStream(args[0]); @Cleanup OutputStream out = new FileOutputStream(args[1]); byte[] b = new byte[10000]; while (true) { int r = in.read(b); if (r == -1) break; out.write(b, 0, r); } } }
Thì lombok sẽ giúp chúng ta sinh ra các đoạn mã tương ứng.
import java.io.*; public class CleanupExample { public static void main(String[] args) throws IOException { InputStream in = new FileInputStream(args[0]); try { OutputStream out = new FileOutputStream(args[1]); try { byte[] b = new byte[10000]; while (true) { int r = in.read(b); if (r == -1) break; out.write(b, 0, r); } } finally { if (out != null) { out.close(); } } } finally { if (in != null) { in.close(); } } } }
Như vậy chúng ta có thể thấy việc sử dụng @Cleanup sẽ giúp chúng ta không phải viết một số lượng lớn code đáng kể và nhàm chán.
Nếu đối tượng các bạn muốn giải phóng tài nguyên sau khi không tồn tại method close() mà chứa một method không có tham số khác cùng chức năng thì bạn có thể chỉ định tên của method trong @Cleanup annotation như sau:
@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0)
Ở trên CoolBar object chứa method dispose() dùng để giải phóng tài nguyên sau khi đã sử dụng.
Try-with-resouce với @Cleanup
Try-with-resouce được ra mắt vào phiên bản JDK 8 giúp quản lý tài nguyê một cách hiệu quả và tránh được những đoạn code dư thừa. Kể cả những dự án mình đã từng làm qua dù lớn hay nhỏ đều không có sử dụng @Cleanup annotation.
Theo quan điểm cá nhân, nếu đang sử dụng JDK 8 trở lên thì bạn nên sử dụng try-with-resouce vì nó cũng giúp chúng ta loại bỏ được rất nhiều mã dư thừa, hơn nữa nó còn là hàng chính thống của Java nên ít nhiều cũng sẽ được tối ưu hơn @Cleanup.
Còn nếu đang sử dụng các phiên bản Java 7 trở xuống không được hỗ trợ try-with-resouce thì các bạn có thể sử dụng @Cleanup để tránh phải code những đoạn code dư thừa.
Tóm lược
Như vậy qua bài viết trên chúng ta đã tìm hiểu thêm được một annotation mới của lomboko @Cleanup giúp quản lý các tài nguyên một cách tự động.