重写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报错:
- 在项目的
lombok.config配置文件中添加配置:lombok.addLombokGeneratedAnnotation = true,让Lombok给所有自动生成的代码添加@lombok.Generated注解 - 升级PMD到6.0以上版本,PMD会自动跳过带
@Generated注解的代码的AccessorMethodGeneration规则校验
抑制错误的适用场景
如果你确定要保留当前自定义Builder的实现,也可以直接针对性抑制该规则,不会有实际业务影响:
在自定义的FooBuilder类上添加注解@SuppressWarnings("PMD.AccessorMethodGeneration")即可,该场景下JVM生成的合成访问器开销极小,对性能没有可感知的影响。
内容的提问来源于stack exchange,提问作者ekapitu
相关产品推荐
相关产品推荐

