Mục lục
Ngoài @NoArgsConstructor cho phép chúng ta tự sinh constructor mặc định thì ở bài viết này chúng ta sẽ tìm hiểu thêm 1 annotation nữa cũng giúp sinh constructor tự động nhưng với một số tính năng nâng cấp đó là @RequiredArgsConstructor.
Để sử dụng Lombok trong project Maven, chúng ta phải thêm dependency:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> </dependency>
@RequiredArgsConstructor trong Lombok
@RequiredArgsConstructor sẽ sinh ra một constructor với các tham số bắt buộc phải có giá trị. Các thuộc tính final và các thuộc tính được đánh dấu @NonNull sẽ bị bắt buộc phải chứa giá trị trong constructor.
Mặc định constructor được sinh ra là public access modifiers.
@RequiredArgsConstructor public class RequiredArgsDemo1 { private Long id; @NonNull private String username; @NonNull private String email; private final boolean status; } // Code được sinh tương ứng public class RequiredArgsDemo1 { private Long id; @NonNull private String username; @NonNull private String email; private final boolean status; public RequiredArgsDemo1( @NonNull final String username, @NonNull final String email, final boolean status ) { if (username == null) { throw new NullPointerException("username is marked non-null but is null"); } if (email == null) { throw new NullPointerException("email is marked non-null but is null"); } this.username = username; this.email = email; this.status = status; } }
@RequiredArgsConstructor với non-final và static fields
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
@RequiredArgsConstructor public class RequiredArgsDemo2 { private Long id; @NonNull private String username = "anonymous"; private final int defaultRole = 1; private static double minSalary = 10000.00; } // Code được sinh tương ứng public class RequiredArgsDemo2 { private Long id; @NonNull private String username = "anonymous"; private final int defaultRole = 1; private static double minSalary = 10000.0; public RequiredArgsDemo2() { } }
Tạo private constructor với @RequiredArgsConstructor
Mặc định thì constructor được sinh ra bởi @RequiredArgsConstructor là public, để làm cho nó trở thành private chúng ta có thể khai báo thêm thuộc tính @RequiredArgsConstructor(access = AccessLevel.PRIVATE).
@RequiredArgsConstructor(access = AccessLevel.PRIVATE) public class RequiredArgsDemo3 { private Long id; @NonNull private String username; } // Code được sinh tương ứng public class RequiredArgsDemo3 { private Long id; @NonNull private String username; private RequiredArgsDemo3(@NonNull final String username) { if (username == null) { throw new NullPointerException("username is marked non-null but is null"); } this.username = username; } }
Khởi tạo một static factory method với @RequiredAgrsConstructor
@RequiredArgsConstructor(staticName = “getInstance”) sẽ sinh ra một static factory method có tên getInstance.
@RequiredArgsConstructor(staticName = "getInstance") public class RequiredArgsDemo4 { private Long id; @NonNull private String username; @NonNull private String email; private final boolean status; } // Code được sinh tương ứng public class RequiredArgsDemo4 { private Long id; @NonNull private String username; @NonNull private String email; private final boolean status; private RequiredArgsDemo4( @NonNull final String username, @NonNull final String email, final boolean status) { if (username == null) { throw new NullPointerException("username is marked non-null but is null"); } if (email == null) { throw new NullPointerException("email is marked non-null but is null"); } this.username = username; this.email = email; this.status = status; } public static RequiredArgsDemo4 getInstance( @NonNull final String username, @NonNull final String email, final boolean status) { return new RequiredArgsDemo4(username, email, status); } }
Tóm lược
Như vậy là mình đã giới thiệu xong một số cách dùng @RequiredArgsConstructor của Lombok rồi, thường thì mình chỉ sử dụng mặc định thôi chứ cũng ít khi dùng đến static factory, hay private constructor. Thế nhưng cứ hãy tìm hiểu hết đi, biết đâu sau này lại cần dùng.
Nguồn tham thảo
https://javabydeveloper.com/lombok-noargsconstructor-examples/