Tags:

Dựng Builder pattern đơn giản với @Buider annotation trong Lombok

@Builder annotation trong project lombok sẽ giúp chúng ta triển khai Builder pattern mà không cần phải viết thêm bất kỳ đoạn code nào. @Builder có thể sử dụng trên class hoặc method, và trong bài viết này chúng ta sẽ tìm hiểu các trường hợp sử dụng @Builder trong các ứng dụng Java.

Maven Dependency

Để sử dụng Lombok trong project chúng ta cần thêm lombok dependency vào project maven.

 

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
</dependency>

Hoặc các bạn có thể sử dụng các phiên bản mới hơn của lombok tại maven central.

Sử dụng @Builder trên class

Chúng ta sẽ tìm hiểu cách sử dụng @Builder annotation trên class trong phần đầu của bài viết, đây cũng là cách sử dụng @Builder annotation phổ biến nhất. 

@Getter
@Builder
public class Widget {
    private final String name;
    private final int id;
}

Chỉ bằng cách chú thích Widget với @Builder annotation, lombok đã giúp chúng ta triển khai builder pattern mà không cần phải viết thêm bất kỳ một đoạn mã nào. 

Bây giờ chúng ta có thể khởi tạo Widget object với builder pattern

Widget widget = Widget.builder()
  .name("foo")
  .id(1)
  .build();
System.out.println(widget.getName);
System.out.println(widget.getId());

Output:

foo
1

Nếu trong class có một số thuộc tính là bắt buộc khi khởi tạo thì chúng ta cần điều chỉnh một số thứ khi sử dụng @Builder

@Builder(builderMethodName = "internalBuilder")
public class RequiredFieldAnnotation {
    @NonNull
    private String name;
    private String description;

    public static RequiredFieldAnnotationBuilder builder(String name) {
        return internalBuilder().name(name);
    }
}

Trong đoạn code trên mình đã xây dựng lại builder method với một tham số truyền vào name được đặt cho thuộc tính name trong RequiredFieldAnnotation class vì nó bắt buộc phải có giá trị trong mỗi RequiredFieldAnnotation object. @Builder annotation mặc định sẽ tạo ra builder method không chứa tham số đầu vào, do đó chúng ta cần chuyển nó sang một cái tên mới là internalBuilder để ẩn đi trong quá trình sử dụng.

Và bây giờ chúng ta có thể sử dụng builder method với các tham số bắt buộc.

RequiredField.builder("NameField").description("Field Description").build();

Sử dụng @Builder trên method

Gỉa sử chúng ta có một class muốn khởi tạo thông qua builder pattern nhưng lại không được phép sữa code hay thừa kế từ class này.

@Value
final class ImmutableClient {
    private int id;
    private String name;
}

@Value annotation giúp chúng ta tạo ra một immutable class bằng việc tất cả các thuộc tính sẽ được đặt thành private và final. Các setter method sẽ không được sinh ra nhầm đảm bảo tính chất immutable.

Để sử dụng builder pattern để khởi tạo ImmutableClient object, chúng ta cần sử dụng @Builder trên method được đặt trong một Builder class mới được chúng ta xây dựng.

class ClientBuilder {

    @Builder(builderMethodName = "builder")
    public static ImmutableClient newClient(int id, String name) {
        return new ImmutableClient(id, name);
    }
}

Bây giờ chúng ta có thể khởi tạo ImmutableClient thông qua ClientBuilder class.

ImmutableClient testImmutableClient = ClientBuilder.builder()
  .name("foo")
  .id(1)
  .build();
System.out.println(widget.getName);
System.out.println(widget.getId());

Output

foo
1

Nguồn

https://www.baeldung.com/lombok-builder

https://projectlombok.org/features/Value

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