我有很多@NonNull
使用 Lombok 构建器的字段类。
@Builder
class SomeObject {
@NonNull String mandatoryField1;
@NonNull String mandatoryField2;
Integer optionalField;
...
}
但是,这为调用者提供了在不设置 a 的情况下创建对象的选项mandatoryField
,使用时会导致运行时失败。
SomeObject.builder()
.mandatoryField1("...")
// Not setting mandatoryField2
.build();
我正在寻找在构建时捕获这些错误的方法。
有像 StepBuilders 甚至构造函数这样的非 Lombok 方法来确保始终设置必填字段,但我对使用 Lombok 构建器实现此目的的方法很感兴趣。
此外,我知道@AllArgsConstructor
为了进行编译时检查而设计类(例如 step-builder 或这些。
@NonNull
现在,当我将字段显式设置为时,FindBugs 确实会失败null
:
FindBugs 检测到此故障,
new SomeObject().setMandatoryField1(null);
但它没有检测到这一点:
SomeObject.builder()
.mandatoryField1(null)
.build();
它也没有检测到这一点:
SomeObject.builder()
.mandatoryField1("...")
//.mandatoryField2("...") Not setting it at all.
.build();
这似乎正在发生,因为 Delomboked 构建器看起来像,
public static class SomeObjectBuilder {
private String mandatoryField1;
private String mandatoryField2;
private Integer optionalField;
SomeObjectBuilder() {}
public SomeObjectBuilder mandatoryField1(final String mandatoryField1) {
this.mandatoryField1 = mandatoryField1;
return this;
}
// ... other chained setters.
public SomeObject build() {
return new SomeObject(mandatoryField1, mandatoryField2, optionalField);
}
}
我观察到:
- Lombok 不会
@NonNull
向其内部字段添加任何内容,也不会向非空字段添加任何空检查。 - 它不调用任何
SomeObject.set*
方法,以便 FindBugs 捕获这些故障。
我有以下问题:
@NonNull
如果设置了属性,有没有办法以导致构建时失败(在运行 FindBugs 或其他方式时)的方式使用 Lombok 构建器?- 是否有任何自定义 FindBugs 检测器可以检测到这些故障?