Tags:

Custom getter, setter với @Accessors trong Lombok

Các method thông dụng như getter, setter đều được project Lombok hỗ trợ để tự generate ra, trong bài viết này chúng ta can thiệp vào quá trình sinh code cho getter, setter thông qua @Accessors annotation.

Default Getter, Setter

Mặc định getter, setter method sẽ được generate theo chuẩn với tiền tố là get, set; tiếp đến là tên của thuộc tính in hoa chữ đầu. Ví dụ

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
    private String firstName;
    private String lastName;
    private int age;
}

class Main {

    public static void main(String[] agrs) {
        User user = new User();
        user.setAge(19);
        user.setFirstName("first name");
        user.setLastName("last name");

        System.out.println(user.getFirstName());
        System.out.println(user.getLastName());
        System.out.println(user.getAge());

    }
}

@Accessors 

@Accessors annotation được sử dụng để tùy biến cách lombok generate getter và setter method với 3 option:

  • fluent
  • chain
  • prefix

Fluent Accessor

Sử dụng fluent option theo cú pháp sau:

@Accessors(fluent = true)

Khi fluent option là true lombok sẽ loại bỏ tiền tố get, set cho getter và setter method.

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

@Getter
@Setter
@Accessors(fluent = true)
public class User {
    private String firstName;
    private String lastName;
    private int age;
}

class Main {

    public static void main(String[] agrs) {
        User user = new User();
        user.age(19);
        user.firstName("first name");
        user.lastName("last name");

        System.out.println(user.firstName());
        System.out.println(user.lastName());
        System.out.println(user.age());

    }
}

Chained Accessors

Sử dụng chain option theo cú pháp sau:

@Accessors(chain = true)

Oprion chain được bật sẽ khiến setter method trả về this thay vì void. Cách này khá giống với Builder pattern, chúng ta có thể gán giá trị cho các thuộc tính liên tiếp trong cùng một mệnh đề. 

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

@Getter
@Setter
@Accessors(fluent = true, chain = true)
public class User {
    private String firstName;
    private String lastName;
    private int age;
}

class Main {

    public static void main(String[] agrs) {
        User user = new User();
        user.lastName("last name")
                .firstName("first name")
                .age(19);

        System.out.println(user.firstName());
        System.out.println(user.lastName());
        System.out.println(user.age());

    }
}

Prefix Accessors

Cuối cùng, đôi khi các thuộc tính được đặt tên không theo chuẩn và chúng ta muốn, sử dụng prefix option để tạo tên cho  getter, và setter method có ý nghĩa hơn. Ví dụ

public class PrefixedAccount { 
    private String sName; 
    private BigDecimal bdBalance; 
}

Khi thêm @Getter@Setter annotation chúng ta sẽ được getSName(), getBdBalance(), setSName(), setBdBlance() tạo cảm thấy khó hiểu khi đọc những method có tên như vậy.

Prefix option cho phép bỏ qua các chuỗi bắt đầu bằng prefix liệt kê trong mảng string tự định nghĩa. Ví dụ mình muốn bỏ ký tự s trong sNamebd trong bdBalance khi lombok generate ra getter, setter method. Các thuộc tính bắt buộc phải khớp với prefix của một trong số prefix trong mảng, nếu không sẽ không được khởi tạo getter, setter method. Lưu nó khi khớp với một prefix thì ký tự tiếp theo phải là ký tự in hoa, ví dụ prefix = f thì fName thõa, nhưng fname thì không.

@Accessors(prefix = {"s", "bd"})
@Getter
@Setter
class PrefixedAccount {
    private String sName;
    private BigDecimal bdBalance;
}

class Main {
    public static void main(String[] agrs) {
        PrefixedAccount account = new PrefixedAccount();
        account.setName("Prefixed Fields");
        account.setBalance(BigDecimal.TEN);

        System.out.println(account.getName());
        System.out.println(account.getBalance());
    }
}

Configuration Properties

Chúng ta có thế cấu hình Accessors cho từng thư mục hoặc cho cả project bằng cách thêm tạo file lombok.config trong thư mục hoặc project tương ứng

lombok.accessors.chain=true
lombok.accessors.fluent=true

Các bạn có thể xem thêm tại Lombok configuration để tìm hiểu chi tiết.

Tóm lược

Trong bài viết này chúng ta đã tìm hiểu cách custom getter, setter method phù hợp với sở thích của mỗi người hoặc tạo style riêng cho project.

Nguồn tham khảo

https://projectlombok.org/features/experimental/Accessors

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

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