You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重写Lombok Builder方法触发PMD AccessorMethodGeneration错误如何解决

问题解决方案

报错根因

PMD触发AccessorMethodGeneration报错的原因是:你自定义了FooBuilder静态内部类的部分方法后,Lombok自动生成的剩余Builder逻辑(包括myAge赋值方法、build()实例化方法)需要跨类访问Foo的私有成员变量,JVM会为这种跨类私有访问自动生成合成访问器,该规则就是针对这种场景的提示。

更优实现方案(优先推荐)

不需要抑制规则,调整代码逻辑即可同时满足校验需求和PMD规范,有两种常用实现:

方案1:校验逻辑收口到全参构造方法

Lombok的@Builder默认依赖类的全参构造实例化对象,你可以显式定义全参构造,把myName的校验逻辑放在构造方法中:

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder(toBuilder = true)
public class Foo {
    private String myName;
    private int myAge;
    
    // 显式定义全参构造,添加校验逻辑
    Foo(String myName, int myAge) {
        // 此处添加myName的校验逻辑
        if (myName == null || myName.trim().isEmpty()) {
            throw new IllegalArgumentException("myName不能为空");
        }
        this.myName = myName;
        this.myAge = myAge;
    }
}

这个方案的优势:

  • 完全不需要自定义Builder内部类,所有Builder相关逻辑都由Lombok自动生成,不会触发PMD报错
  • 校验逻辑统一收口,不管是用Builder实例化还是直接new对象,都会触发校验,避免校验遗漏

方案2:赋值阶段校验的兼容实现

如果你必须在调用myName()赋值时就触发校验,不想等到build阶段才校验,可以按以下方式调整,避免PMD报错:

  1. 在项目的lombok.config配置文件中添加配置:lombok.addLombokGeneratedAnnotation = true,让Lombok给所有自动生成的代码添加@lombok.Generated注解
  2. 升级PMD到6.0以上版本,PMD会自动跳过带@Generated注解的代码的AccessorMethodGeneration规则校验

抑制错误的适用场景

如果你确定要保留当前自定义Builder的实现,也可以直接针对性抑制该规则,不会有实际业务影响:
在自定义的FooBuilder类上添加注解@SuppressWarnings("PMD.AccessorMethodGeneration")即可,该场景下JVM生成的合成访问器开销极小,对性能没有可感知的影响。

内容的提问来源于stack exchange,提问作者ekapitu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:57:00