У меня есть много классов с полями @NonNull
с использованием Lombok-сборщиков.
@Builder
class SomeObject {
@NonNull String mandatoryField1;
@NonNull String mandatoryField2;
Integer optionalField;
...
}
Однако это дает вызывающей стороне возможность создать объект без установки mandatoryField
, который при использовании приведет к сбою во время выполнения.
SomeObject.builder()
.mandatoryField1("...")
// Not setting mandatoryField2
.build();
Я ищу способы поймать эти ошибки во время сборки.
Существуют способы, отличные от Lombok, такие как StepBuilders или даже конструктор, чтобы гарантировать, что обязательные поля всегда заданы, но меня интересуют способы достижения этого с помощью Lombok builder.
Кроме того, я понимаю, что проектирование классов (например, построитель шагов или @AllArgsConstructor
) для проверки времени компиляции создаст много неуклюжего кода - вот почему я мотивирован на создание посткомпилирующего этапа FindBugs который их обнаруживает.
Теперь FindBugs не работает, когда я явно устанавливаю поле @NonNull
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*
, поскольку FindBugsSomeObject.set*
эти сбои.
У меня есть следующие вопросы:
- Есть ли способ использовать построители Lombok таким образом, который вызывает сбои времени сборки (при запуске FindBugs или иначе), если
@NonNull
атрибуты@NonNull
? - Есть ли какой-либо пользовательский детектор FindBugs, который обнаруживает эти сбои?