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