Loading...
Loading...
Lombok 注解使用规则技能。覆盖 @Data/@Builder/@Slf4j 组合规则、@EqualsAndHashCode(callSuper=true)继承陷阱、与Jackson/@Builder/@Jacksonized组合、与MyBatis无参构造器冲突解决、@Value不可变对象、@With对象复制、@SuperBuilder继承Builder。 纠正 LLM 最常见的 Lombok 误用:不写 callSuper、不加 @Jacksonized、Builder 与继承冲突、@Builder.Default 默认值丢失。
npx skill4agent add full-stack-skills/java-skills lombok-patterns| # | 错误 | 正确做法 |
|---|---|---|
| 1 | 子类 | |
| 2 | | 实体不要用 @Builder(破坏无参构造,MyBatis需要) |
| 3 | Jackson 反序列化 @Builder 对象失败(无默认构造器) | 加 |
| 4 | 父类字段不参与 hashCode/equals | 子类加 |
| 5 | 用 | 用 |
| 6 | | 用 |
| 7 | DTO 用 | 用 |
| 8 | | |
| 9 | JPA 实体 | JPA 实体用 |
| 10 | | @Builder 自带全参构造器,不需要 @AllArgsConstructor |
// ✅ MyBatis 实体: 用 @Data,不加 @Builder
@Data
@TableName("sys_user")
public class SysUser extends BaseEntity<SysUser> {
// ⚠️ 继承时 BaseEntity 已声明 @EqualsAndHashCode(callSuper=false)
private String username;
// ❌ 不要加 @Builder — MyBatis 需要无参构造器
// ❌ 不要加 @AllArgsConstructor — @Data 已含 @RequiredArgsConstructor
}
// ✅ 如果必须用 Builder + 实体(需要加所有构造器)
@Data
@Builder
@NoArgsConstructor // ← MyBatis 需要
@AllArgsConstructor // ← @Builder 需要
public class UserEntity {
private String name;
private Integer age;
}// ✅ DTO/VO — 不可变,适合 API 返回值
@Value
@Builder
@Jacksonized // ← Jackson 反序列化支持(Lombok 1.18.14+)
public class UserDTO {
Long id;
String username;
@Builder.Default Integer age = 0; // ← 默认值必须加 @Builder.Default!
}// ✅ @SuperBuilder — 继承场景的 Builder 方案
@SuperBuilder
@Data
public class Parent {
private String parentField;
}
@SuperBuilder // ← 父类和子类都必须加 @SuperBuilder
@Data
@EqualsAndHashCode(callSuper = true)
public class Child extends Parent {
private String childField;
}// ✅ 精确控制: 用 @Getter @Setter 替代 @Data
@Getter
@Setter
@ToString
@EqualsAndHashCode(onlyExplicitlyIncluded = true) // ← 只包含指定字段
public class UserEntity {
@EqualsAndHashCode.Include
private Long id; // ← 只以 id 做 equals/hashCode
private String name;
@ToString.Exclude
private String password; // ← toString 中排除
}
// ✅ @With — 不可变对象的"修改"(返回新对象)
@Value
@Builder
@Jacksonized
public class OrderDTO {
Long id;
String status;
public OrderDTO withStatus(String newStatus) {
return new OrderDTO(this.id, newStatus);
}
}
// ✅ @With 一行搞定(等同上方法)
@Value
@Builder
@Jacksonized
public class OrderDTO {
Long id;
@With String status; // ← 自动生成 withStatus() 返回新对象
}// ✅ @Slf4j
@Slf4j
public class UserService {
public void doSomething() {
log.info("处理用户: {}", userId); // 不用写 LoggerFactory.getLogger
}
}需要什么?
├── 纯数据类(DTO/VO/返回值)
│ ├── 需要 Builder → @Value + @Builder + @Jacksonized
│ ├── 需要继承 → @SuperBuilder(父+子) + @Value
│ └── 简单数据 → @Value
├── JPA/Hibernate实体
│ ├── 推荐 → @Getter + @Setter + @EqualsAndHashCode(onlyExplicitlyIncluded=true)
│ └── 避免 → @Data (懒加载N+1, toString循环)
├── MyBatis/MyBatis-Plus 实体
│ ├── 无继承 → @Data
│ ├── 有继承 → @Data + @EqualsAndHashCode(callSuper=true)
│ └── 需Builder → @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor
└── 配置类/Service
└── @Slf4j + @RequiredArgsConstructor (final字段注入)