Дополнительные методы в классе 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();
Другие вопросы по тегам