Lombok @Builder с Java 8 Lambda Builder Pattern - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь использовать Lombok с шаблоном Java 8 Lambda Builder, представленным здесь .

POJO:

@JsonInclude(Include.NON_NULL)
@Builder
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
public class RestResponse<T> {
  @Getter @Setter @Builder.Default private Boolean success = true;
  @Getter @Setter @NonNull private T data;

  public static class RestResponseBuilder<T> {
    public RestResponseBuilder<T> with(Consumer<RestResponseBuilder<T>> builderFunction) {
      builderFunction.accept(this);
      return this;
    }

    public RestResponse<T> createRestResponse() {
      return new RestResponse<T>(success, data);
    }
  }
}

Использование:

  @GetMapping(value = "/testLambdaBuilder", produces = MediaType.APPLICATION_JSON_VALUE)
  @ResponseBody
  public RestResponse<String> testEndpointLambdaBuilder() {
    return new RestResponseBuilder<String>().with($ -> $.data = "helloWorld").createRestResponse();
  }

Lombok, кажется, создает конструктор уровня пакета для компоновщика. Есть ли способ изменить его на публичный? Я получаю ошибку:

Конструктор RestResponse.RestResponseBuilder () не отображается

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Какой смысл использовать шаблон лямбда-строителя в сочетании с Lombok?

Насколько я понимаю, использование шаблона лямбда-компоновщика избавляет вас от добавления методов сеттера в ваш компоновщик (и правильной его реализации) каждый раз, когда вы добавляете новую переменную в объект pojo / value.

Но если вы уже используете Lombok для генерации вашего компоновщика, весь код компоновщика уже сгенерирован. Таким образом, нет необходимости писать методы самостоятельно. Lombok также обновляет код разработчика всякий раз, когда вы меняете свое pojo.

Поэтому я бы порекомендовал: либо использовать Lombok, и использовать созданный по умолчанию компоновщик, либо написать свой компоновщик самостоятельно и использовать шаблон компоновщика lambda, чтобы избавить вас от написания и поддержки слишком большого числа методов.

0 голосов
/ 16 июля 2018

Поскольку класс построителя уже частично существует, Lombok просто вставит правильные поля в ваш RestResponseBuilder. От документация (упор мой):

Каждый указанный сгенерированный элемент будет автоматически пропущен, если этот элемент уже существует (не учитывая количество параметров и глядя только на имена). Это включает в себя сам строитель: Если этот класс уже существует, lombok просто начнет вводить поля и методы внутри это уже существующий класс, если, конечно, поля / методы для впрыснуть уже существует.

Итак, если вы хотите, чтобы поле было публично видимо в классе построителя, вам просто нужно объявить его там, и Lombok будет его уважать:

public static class RestResponseBuilder<T> {
    public T data;

    public RestResponseBuilder<T> with(Consumer<RestResponseBuilder<T>> builderFunction) {
        builderFunction.accept(this);
        return this;
    }

    public RestResponse<T> createRestResponse() {
        return new RestResponse<T>(success, data);
    }
}

Все это говорит о том, что ваш with метод кажется довольно странным. Вы можете просто сделать это:

return new RestResponse.RestResponseBuilder<String>().data("helloWorld").createRestResponse();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...