【问题标题】:Can't access constructor with @AllArgsConstructor but works with @RequiredArgsConstructor无法使用 @AllArgsConstructor 访问构造函数,但可以使用 @RequiredArgsConstructor
【发布时间】:2019-07-01 18:24:40
【问题描述】:

我有一个 POJO 类如下:

@Value
@Builder
public class XYZ {

    @NonNull
    private final String a;

    @NonNull
    private final String b;

    @NonNull
    private final State state;

    public enum State {
        STARTED
    }
}

当我尝试从我的 tst/ 文件夹创建 XYZ 类的对象时,它失败并出现无法从外部包访问构造函数的错误,但是当我在该 POJO 中使用 @RequiredArgsConstructor 时,它开始正常工作并且没有t 显示错误。实际的错误是这样的:

错误:XYZ(String,String,State) 在 XYZ 中不公开;不可能是 从外部包访问

所以,我想知道@AllArgsConstructor(由@Value 提供)和@RequiredArgsConstructor 之间有什么区别,因此我看到了这个问题。

【问题讨论】:

  • 我强烈怀疑您的@Builder 导致构造函数被隐藏。
  • 感谢您的回答。是的,就是因为这个。但这是为什么呢?

标签: java lombok


【解决方案1】:

在处理其注解时,Lombok 不会考虑源文件中这些注解的顺序。相反,每个注释类型都有一个确定处理顺序的优先级。这是因为不同注解类型之间存在依赖关系。

@Builder 的优先级高于@Value。因此,Lombok 首先生成构建器所需的包私有全参数构造函数。结果,在处理@Value 时已经存在构造函数。根据the @Value documentation,“任何显式构造函数,无论参数列表如何,都意味着 lombok 不会生成构造函数”。

但是,在我看来,这在文档中有点误导。为@Builder 生成的构造函数更像是一个实现细节,但我不会称它为“显式构造函数”。 (作者的“显式”可能是指“不是默认构造函数”。)

一旦添加了@RequiredArgsConstructor@AllArgsConstructor(在本例中也是如此),构造函数就会变为公共的,@Builder@Value 都不必再生成它了。

【讨论】:

    猜你喜欢
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多