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.
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 (password, token, privateKey):@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ống
Giải thích
@Data cho Entity có @OneToMany
gây loop trong toString()/equals()
@Builder trên class có default value
default không áp dụng khi build
@Value với JPA entity
entity cần setter & constructor trống
Dùng @AllArgsConstructor public cho entity
phá vỡ JPA proxy
Dùng @Builder cho class lồng nhau
dễ 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
Be First to Comment