我有一个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之间有什么区别,因为我看到了这个问题。
答案 0 :(得分:2)
在处理其注释时,Lombok不会考虑这些注释在源文件中的顺序。而是,每种注释类型都具有确定处理顺序的优先级。这是因为不同的注释类型之间存在依赖性。
@Builder
的优先级高于@Value
。因此,Lombok首先生成生成器所需的package-private all-args构造器。结果,在处理@Value
时已经存在一个构造函数。根据{{3}},“任何显式构造函数,无论参数列表如何,都意味着lombok不会生成构造函数”。
但是,我认为这在文档中有些误导。为@Builder
生成的构造函数更像是一个实现细节,但我不会将其称为“显式构造函数”。 (通过“明确”,作者可能表示“不是默认构造函数”。)
一旦添加了@RequiredArgsConstructor
或@AllArgsConstructor
(在这种情况下是相同的),构造函数就成为公共的,@Builder
和@Value
都不需要生成它更多。