Skip to content

Best Practices Khi Dùng Lombok

I. Quy tắc chung khi dùng Lombok

1. Chỉ dùng Lombok để giảm boilerplate – không dùng thay design

  • Mục tiêu của Lombok là giảm code lặp như getter/setter, constructor, builder.
  • Đừng dùng Lombok để “ẩn” logic nghiệp vụ, ví dụ:@Data // KHÔNG NÊN nếu class có logic trong setter public class Account { private double balance; public void setBalance(double balance) { if (balance < 0) throw new IllegalArgumentException("Invalid"); this.balance = balance; } } → Khi có logic trong setter/getter → tự viết thủ công, không dùng @Data.

2. Chỉ bật annotation cần thiết – tránh @Data

  • @Data = @Getter + @Setter + @RequiredArgsConstructor + @ToString + @EqualsAndHashCode.
    → Nó quá “nặng”, dễ sinh bug khi có quan hệ vòng, JPA, hoặc logic đặc biệt.
  • Khuyến nghị:
    • Entity: @Getter@Setter@NoArgsConstructor@AllArgsConstructor.
    • DTO: @Data hoặc @Builder.
    • Immutable object: @Value hoặc @Builder.

3. Đặt rõ scope cho @Builder

  • Dùng @Builder trên DTO hoặc request object, không nên dùng trên entity.
  • Lý do:
    • Entity cần JPA constructor → dễ xung đột với builder.
    • Builder có thể bỏ qua validation logic hoặc default value.
  • Nếu muốn builder cho entity, dùng @SuperBuilder (để kế thừa an toàn) + constructor protected.

4. Kết hợp annotation theo vai trò

Loại classLombok khuyến nghị
JPA Entity@Getter@Setter@NoArgsConstructor@AllArgsConstructor@Builder@EqualsAndHashCode(onlyExplicitlyIncluded = true)
DTO / VO@Data hoặc @Builder
Request / Response object@Builder@Value
Immutable config / constant class@Value@Builder(toBuilder = true)

II. Quy tắc riêng theo annotation

1. @Data

  • Không dùng nếu class:
    • Có mối quan hệ vòng (entity có field tham chiếu qua lại)
    • Có logic setter phức tạp
    • Dùng JPA (gây recursion hoặc performance issue)
  • Nếu vẫn muốn dùng, exclude các field vòng:@ToString(exclude = "teacher") @EqualsAndHashCode(exclude = "teacher")

2. @Builder

  • Khi dùng @Builder, hãy thêm constructor phù hợp cho JPA hoặc MapStruct.@Builder @AllArgsConstructor @NoArgsConstructor public class User { ... }
  • Nếu kế thừa → dùng @SuperBuilder.
  • Nếu cần copy/update object → dùng toBuilder = true.

3. @Value (Immutable)

  • Dùng cho các immutable object (config, event payload, response object).
  • Nó tự động thêm private final và không có setter.
  • Nếu cần thay đổi 1 field → dùng toBuilder = true:@Value @Builder(toBuilder = true) class Person { String name; int age; }

4. @EqualsAndHashCode

  • Nên dùng onlyExplicitlyIncluded = true và chọn rõ các field:@EqualsAndHashCode(onlyExplicitlyIncluded = true) public class User { @EqualsAndHashCode.Include private Long id; private String name; } → Tránh tính toàn bộ field gây performance issue hoặc recursion.

5. @ToString

  • Tránh in các field nhạy cảm (passwordtokenprivateKey):@ToString(exclude = "password")

III. Một số mẹo nâng cao

1. Bật “Show generated code” trong IDE

  • IntelliJ: Alt + Insert → Show Lombok generated code
    → Giúp hiểu Lombok thực sự tạo gì, dễ debug hơn.

2. Luôn bật annotation processing trong CI/CD

  • Nếu build qua Maven hoặc Gradle CI → thêm plugin annotation processing (nếu tắt Lombok mặc định).

3. Kiểm soát version Lombok

  • Dự án lớn → lock version Lombok, tránh build lệch giữa dev & CI.implementation 'org.projectlombok:lombok:1.18.34' annotationProcessor 'org.projectlombok:lombok:1.18.34'

4. Không mix Lombok với code generator khác (MapStruct, Immutables, Record)

  • Dễ sinh lỗi “missing accessor”, “ambiguous constructor”.

IV. Anti-pattern cần tránh

Tình huốngGiải thích
@Data cho Entity có @OneToManygây loop trong toString()/equals()
@Builder trên class có default valuedefault không áp dụng khi build
@Value với JPA entityentity cần setter & constructor trống
Dùng @AllArgsConstructor public cho entityphá vỡ JPA proxy
Dùng @Builder cho class lồng nhaudễ sinh NPE do inner static class

V. Checklist khi review code Lombok

✔ Dùng đúng annotation theo loại class
✔ Không có vòng lặp trong equals/toString
✔ Có constructor trống nếu là entity
✔ Không in field nhạy cảm
✔ Không mix Lombok với logic setter/getter tùy chỉnh

Published inAll

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *