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

时间:2019-07-01 18:24:40

标签: java lombok

我有一个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之间有什么区别,因为我看到了这个问题。

1 个答案:

答案 0 :(得分:2)

在处理其注释时,Lombok不会考虑这些注释在源文件中的顺序。而是,每种注释类型都具有确定处理顺序的优先级。这是因为不同的注释类型之间存在依赖性。

@Builder的优先级高于@Value。因此,Lombok首先生成生成器所需的package-private all-args构造器。结果,在处理@Value时已经存在一个构造函数。根据{{​​3}},“任何显式构造函数,无论参数列表如何,都意味着lombok不会生成构造函数”。

但是,我认为这在文档中有些误导。为@Builder生成的构造函数更像是一个实现细节,但我不会将其称为“显式构造函数”。 (通过“明确”,作者可能表示“不是默认构造函数”。)

一旦添加了@RequiredArgsConstructor@AllArgsConstructor(在这种情况下是相同的),构造函数就成为公共的,@Builder@Value都不需要生成它更多。