Я хочу, чтобы 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 в пользу моего собственного статического метода.
Есть ли лучший способ с Ломбоком?