Дополнительные методы в классе Java Builder (аннотация lombok)
Итак, у меня есть класс, который использует аннотацию @Builder lombok. Вот как это выглядит и как я его использую:
import lombok.Builder;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonProperty;
@Data
@Builder
public class MyModel {
@JsonProperty(value = "myField1")
private String myField1;
@JsonProperty(value = "myField2")
private String myField2;
@JsonProperty(value = "myField3")
private String myField3;
}
//This is how I use it:
MyModel model = MyModel.builder()
.myField1("value for field 1")
.myField2("value for field 2")
.build();
У меня вопрос: если это хорошая практика или нет добавить какой-то дополнительный метод в этот класс? Или я должен оставить все как есть и заниматься какой-либо бизнес-логикой за пределами??
По сути, скажем, мне нужен вспомогательный метод для установки свойства myField3, потому что я НЕ МОГУ просто сделать:
.myField3("value for field 3")
.build()
Мне нужно выполнить некоторые действия со значением для field3 и после этого установить его в MyModel.
Так можно ли добавить этот вспомогательный метод в этот класс?
1 ответ
Согласно документации Lombok's Builder,
Каждый из перечисленных сгенерированных элементов будет пропущен без уведомления, если этот элемент уже существует (без учета количества параметров и просмотра только имен). Это включает в себя и сам конструктор: если этот класс уже существует, lombok просто начнет внедрять поля и методы внутри этого уже существующего класса, если, конечно, поля / методы для внедрения уже существуют. Вы не можете использовать какой-либо другой метод (или конструктор), генерирующий аннотацию lombok, для класса построителя; например, вы не можете поместить @EqualsAndHashCode в класс построителя.
Так можно ли добавить этот вспомогательный метод в этот класс?
Да, вы можете иметь минимальный компоновщик, который предоставляет метод с тем же именем, что и поле, т.е. myField3
, Бизнес-логика может быть добавлена к этому методу. Вот простой пример, в котором "Hello" добавляется к значению, заданному установщиком,
@Data
@Builder
public class MyModel {
private String myField1;
private String myField2;
private String myField3;
public static class MyModelBuilder {
public MyModelBuilder myField3(String myField3) {
this.myField3 = "Hello " + myField3;
return this;
}
}
}
Вот пример использования вашего класса,
MyModel model = MyModel.builder()
.myField1("value for field 1")
.myField2("value for field 2")
.myField3("value for field 3")
.build();