Tags:

Cách sử dụng @RequiredArgsConstructor của Lombok

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 @RequiredArgsConstructorpublic, để 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/

https://projectlombok.org/features/constructor

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x