为何Lombok的@Builder无法与@NoArgsConstructor共存?附报错分析
Lombok中@Builder与@NoArgsConstructor共存触发异常的深层技术原因
异常触发场景
当在同一个类上同时标注@Builder和@NoArgsConstructor,且未显式添加@AllArgsConstructor时,若在跨包代码中使用Builder构建实例,会触发如下编译异常:
@Builder ^ required: no arguments found: String,String,String reason: actual and formal argument lists differ in length
深层技术原因
- @Builder的默认行为
@Builder注解会自动为目标类生成三个核心元素:
- 内部静态Builder类,用于链式设置属性
- 静态
builder()方法,用于创建Builder实例 - 包私有访问权限的全参构造方法,供Builder的
build()方法调用以生成目标类实例
@NoArgsConstructor的影响
@NoArgsConstructor会为目标类生成一个无参构造方法。此时Java编译器不会再自动生成默认构造,但关键冲突点在于:
当未显式添加@AllArgsConstructor时,@Builder生成的全参构造方法仅为包私有。若代码在不同包下使用Builder,Builder类无法访问目标类的包私有全参构造,编译期会尝试寻找可访问的构造方法——此时只有无参构造是可访问的,但Builder的build()方法需要传入所有属性对应的参数,与无参构造的参数列表完全不匹配,因此触发参数长度不符的异常。权限控制的隐性冲突
Lombok在生成构造方法时,未对跨包场景下的权限兼容做特殊处理:@Builder默认依赖的全参构造权限不足,而@NoArgsConstructor提供的无参构造无法满足Builder的参数需求,两者的组合在跨包访问时就会暴露这个编译错误。
解决思路
- 显式添加
@AllArgsConstructor,将全参构造的访问权限设置为公开,确保Builder在任何包下都能调用全参构造 - 若不需要全参构造公开,可将Builder的使用代码放在与目标类相同的包下,确保能访问包私有全参构造
内容的提问来源于stack exchange,提问作者ruyang chen
相关产品推荐
相关产品推荐

