无法使用@AllArgsConstructor 访问构造函数,但可以使用@RequiredArgsConstructor

Can't access constructor with @AllArgsConstructor but works with @RequiredArgsConstructor

我有一个 POJO class 如下:

@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 class 的对象时,它失败并出现无法从外部包访问构造函数的错误,但是当我在该 POJO 中使用 @RequiredArgsConstructor 时,它开始工作正常并且不显示错误。实际错误是这样的:

error: XYZ(String,String,State) is not public in XYZ; cannot be accessed from outside package

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

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

@Builder 的优先级高于 @Value。所以Lombok首先生成builder所需要的package-private all-args构造函数。结果,在处理 @Value 时已经存在一个构造函数。根据the @Value documentation、"any explicit constructor, no matter the arguments list, implies lombok will not generate a constructor".

但是,我认为这在文档中有点误导。为 @Builder 生成的构造函数更像是一个实现细节,但我不会将其称为 "explicit constructor"。 ("explicit" 作者的意思可能是 "not a default constructor"。)

一旦添加 @RequiredArgsConstructor@AllArgsConstructor(在本例中相同),构造函数变为 public,并且 @Builder 和 [=11= 都不是] 必须再生成它。