非空洞龙目岛建造者属性的 FindBugs 检测器
我有很多使用龙目岛建造者的字段的类。@NonNull
@Builder
class SomeObject {
@NonNull String mandatoryField1;
@NonNull String mandatoryField2;
Integer optionalField;
...
}
但是,这为调用方提供了在不设置 的情况下创建对象的选项,当使用时,这将导致运行时故障。mandatoryField
SomeObject.builder()
.mandatoryField1("...")
// Not setting mandatoryField2
.build();
我正在寻找在构建时捕获这些错误的方法。
有一些非龙目岛的方式,如StepBuilders甚至构造函数来确保始终设置必填字段,但我对使用龙目岛构建器实现这一目标的方法感兴趣。
此外,我明白设计类(如步骤生成器或)以便进行编译时检查会产生很多笨拙的代码 - 这就是为什么我有动力构建一个后编译的FindBugs步骤来检测这些。@AllArgsConstructor
现在,当我显式将字段设置为:@NonNull
null
FindBugs 检测到此故障,
new SomeObject().setMandatoryField1(null);
但它没有检测到这个:
SomeObject.builder()
.mandatoryField1(null)
.build();
它也没有检测到这一点:
SomeObject.builder()
.mandatoryField1("...")
//.mandatoryField2("...") Not setting it at all.
.build();
这似乎正在发生,因为被破坏的建造者看起来像这样,
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 不会向其内部字段添加任何内容,也不会向非 null 字段添加任何空检查。
@NonNull
- 它不会调用任何方法,以便 FindBugs 捕获这些故障。
SomeObject.set*
我有以下问题:
- 如果设置了属性,有没有办法以导致构建时失败的方式使用龙目岛构建器(在运行FindBugs时或其他方式)?
@NonNull
- 是否有任何自定义的 FindBugs 检测器可以检测这些故障?