mcpField
L
lombok-patterns

lombok-patterns

github.com/emvnuel开发287 次安装12 周前更新
代码仓库

关于 lombok-patterns

lombok-patterns 是面向 Java 开发者的 Project Lombok 使用指南,涵盖注解、集成模式和实践建议。内容特别说明 Java 21+ 中可由现代语言特性替代的 Lombok 用法。

主要功能

  1. 01按用途整理常用 Lombok 注解
  2. 02提供 JPA 与 Spring 集成模式
  3. 03说明 Java Records 的适用场景
  4. 04列出常见陷阱及规避建议

适用场景

  1. 01为 JPA 实体选择合适的注解
  2. 02在 Spring 服务中使用构造器注入
  3. 03判断简单 DTO 是否适合改用 Record
  4. 04审查 Lombok 用法并排查常见问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/emvnuel/skills --skill lombok-patterns

安装后在 Claude Code 中输入/lombok-patterns确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

cookbook/
builder-annotation.md
configuration-properties.md
constructor-annotations.md
data-annotation.md
dependency-injection.md
entity-patterns.md
equals-hashcode-jpa.md
getter-setter.md
logging-annotations.md
non-null.md
sneaky-throws.md
synchronized-annotation.md
value-annotation.md
with-annotation.md

详细介绍

Lombok 模式

此技能介绍如何使用 Project Lombok 减少 Java 应用中的样板代码,涵盖注解、最佳实践和集成模式。

注意:本指南适用于 Java 21+ 项目。由于 Java 的现代特性(Records、var、try-with-resources),部分 Lombok 功能现已过时。请参阅下文的 Java 21+ 注意事项。

概述

Lombok 是一个 Java 库,可在编译期间自动生成 getter、setter、构造函数、构建器等常见代码。它有助于编写更简洁、更易维护的代码。

Java 21+ 注意事项

部分 Lombok 功能与 Java 的现代特性重复:

Lombok 功能Java 替代方案建议
val/varvar(Java 10+)使用 Java var
@Valuerecord(Java 16+)简单值对象优先使用 record
@Datarecord(Java 16+)简单 DTO 优先使用 record
@Cleanuptry-with-resources(Java 7+)使用 try-with-resources
@Withrecord 的 wither 方法Record 可以定义 wither 方法
Lombok 仍有价值的场景
  • JPA 实体:Record 不适用于 JPA(需要无参构造函数和可变状态)
  • @Builder:Record 不内置构建器支持
  • @Slf4j:Java 没有生成日志记录器的对应功能
  • @RequiredArgsConstructor:适用于 Spring 依赖注入
  • 继承:Record 不能扩展类

注解类别

核心注解(仍有价值)
注解用途使用场景
@Getter/@Setter访问器方法JPA 实体、可变类
@NoArgsConstructor无参构造函数JPA 实体、序列化
@AllArgsConstructor全字段构造函数依赖注入
@RequiredArgsConstructor为 final/@NonNull 字段生成构造函数Spring 服务
@Builder构建器模式实现复杂对象构造
考虑改用 Java Record
Lombok适用 Java Record 的场景
@Value简单的不可变数据载体
@Data不涉及继承的简单 DTO
// ✅ Prefer Java Record for simple value objects
public record Money(BigDecimal amount, String currency) {}

// ✅ Prefer Java Record for simple DTOs
public record CustomerDTO(String name, String email) {}

// ✅ Use Lombok for JPA entities (records don't work with JPA)
@Entity
@Getter
@Setter
@NoArgsConstructor
public class Customer {
    @Id private Long id;
    private String name;
}
日志注解
注解日志记录器类型
@Slf4jSLF4J(推荐)
@Log4j2Log4j 2
@Logjava.util.logging
@CommonsLogApache Commons Logging
字段和方法注解
注解用途
@NonNull对参数/字段进行空值检查
@With不可变 setter(创建新实例)
@SneakyThrows无需声明即可抛出受检异常
@Synchronized方法同步,确保线程安全
@ToString可自定义 toString() 生成方式
@EqualsAndHashCode可自定义 equals/hashCode

快速参考

JPA 实体(推荐使用 Lombok)
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class Product {
    @Id
    @EqualsAndHashCode.Include
    private Long id;

    private String name;
    private BigDecimal price;
}
Spring 服务
@Service
@RequiredArgsConstructor
@Slf4j
public class OrderService {
    private final OrderRepository orderRepository;
    private final PaymentService paymentService;

    public Order process(Order order) {
        log.info("Processing order: {}", order.getId());
        return orderRepository.save(order);
    }
}
构建器模式(Lombok 能带来价值)
// Records don't have builder support - use Lombok
@Builder
public record Email(
    String to,
    String subject,
    String body,
    @Singular List<String> attachments
) {}

// Usage
Email email = Email.builder()
    .to("[email protected]")
    .subject("Hello")
    .body("Content")
    .attachment("file1.pdf")
    .build();

最佳实践

✅ 推荐
  • 对于简单的值对象和 DTO,使用 Java Records
  • 使用 @RequiredArgsConstructor 和 final 字段进行依赖注入
  • 使用 @Slf4j 记录日志,而不是手动创建日志记录器
  • 对包含许多可选字段的类使用 @Builder
  • 对 JPA 实体显式使用 @EqualsAndHashCode
❌ 避免
  • 在 Java Record 足以胜任时使用 @Data 或 @Value
  • 在 JPA 实体上使用 @Data(请使用单独的注解)
  • 将 @EqualsAndHashCode 用于延迟加载的 JPA 关系
  • 过度使用 @SneakyThrows(会使异常处理不清晰)

常见陷阱

陷阱问题解决方案
实体上使用 @Data包含可变的 setter,且 equals/hashCode 存在问题使用 @Getter、@Setter,并显式使用 @EqualsAndHashCode
缺少 @NoArgsConstructorJPA/Jackson 需要无参构造函数始终与 @AllArgsConstructor 一起添加
循环引用的 @ToString双向关系会导致 StackOverflow在一侧使用 @ToString.Exclude
对简单 DTO 使用 Lombok引入了不必要的依赖改用 Java Records

Cookbook 索引

核心注解
字段和方法注解
集成模式

评论

支持 Markdown