Можно ли использовать Lombok @Builder, начиная со статического метода? - PullRequest
0 голосов
/ 29 апреля 2019

Я хочу, чтобы Lombok позаботился о моем API-интерфейсе для конструктора, а также имел конструктор для начала.

Я начал с конструктора в классе @Data в сочетании с @Builder(toBuilder = true), но после этого мне пришлось принудительно задавать недопустимые или фиктивные значения в конечных полях, а также менее выразительный свободный API. Наконец-то я решил свою ситуацию статическим методом, но надеюсь, что Lombok найдет лучшее решение для моего варианта использования.

API с использованием toBuilder

fooHandler.accept(new TweakedFoo(Foo.class, Mode.QUICK).toBuilder()
          .mappingOutcomeFor(FooOutcome.class)
          .mappingOutcome(toEvent(BarOutcome.class))
          .build()));

API с использованием статического метода

fooHandler.accept(tweakFoo(Foo.class, Mode.QUICK)
          .mappingOutcomeFor(FooOutcome.class)
          .mappingOutcome(toEvent(BarOutcome.class))
          .build()));

Посмотрите, как лучше работает вторая установка?

Соответствующая настройка Lombok (упрощенная)

@Data
@Builder(toBuilder = true)
public class TweakedFoo {

    private final Class<Foo> from;
    private final Mode mode;
    private final Class<?> to;

    public TweakedFoo(Class<Foo> from, Mode mode) {
        this.from = from;
        this.mode = mode;
        this.to = null; // eww
    }
}

И

@Data
@Builder(builderMethodName = "useTweakedFooDotTweakedFooInsteadPlease")
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class TweakedFoo {

    private final Class<Foo> from;
    private final Mode mode;
    private final Class<?> to;

    public static TweakedFooBuilder tweakFoo(Class<Foo> from, Mode mode) {
        return TweakedFoo.useTweakedFooDotTweakedFooInsteadPlease()
                         .from(from)
                         .mode(mode);
    }

}

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

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

Есть ли лучший способ с Ломбоком?

1 Ответ

1 голос
/ 29 апреля 2019

Вы можете настроить свой метод builder(), просто внедрив его самостоятельно:

@Data
@Builder
public class TweakedFoo {
    // ...
    public static TweakedFooBuilder builder(Class<Foo> from, Mode mode) {
        return new TweakedFooBuilder()
            .from(from)
            .mode(mode);
    }
    // ...
}

В этом случае Lombok не будет генерировать другой метод builder(), поскольку он распознает существующий метод с тем же именем. Если вы хотите, чтобы метод назывался по-другому, например, tweakFoo, используйте @Builder(builderMethodName="tweakFoo").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...