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

为何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

深层技术原因

  1. @Builder的默认行为
    @Builder注解会自动为目标类生成三个核心元素:
  • 内部静态Builder类,用于链式设置属性
  • 静态builder()方法,用于创建Builder实例
  • 包私有访问权限的全参构造方法,供Builder的build()方法调用以生成目标类实例
  1. @NoArgsConstructor的影响
    @NoArgsConstructor会为目标类生成一个无参构造方法。此时Java编译器不会再自动生成默认构造,但关键冲突点在于:
    当未显式添加@AllArgsConstructor时,@Builder生成的全参构造方法仅为包私有。若代码在不同包下使用Builder,Builder类无法访问目标类的包私有全参构造,编译期会尝试寻找可访问的构造方法——此时只有无参构造是可访问的,但Builder的build()方法需要传入所有属性对应的参数,与无参构造的参数列表完全不匹配,因此触发参数长度不符的异常。

  2. 权限控制的隐性冲突
    Lombok在生成构造方法时,未对跨包场景下的权限兼容做特殊处理:@Builder默认依赖的全参构造权限不足,而@NoArgsConstructor提供的无参构造无法满足Builder的参数需求,两者的组合在跨包访问时就会暴露这个编译错误。

解决思路

  • 显式添加@AllArgsConstructor,将全参构造的访问权限设置为公开,确保Builder在任何包下都能调用全参构造
  • 若不需要全参构造公开,可将Builder的使用代码放在与目标类相同的包下,确保能访问包私有全参构造

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:25:23