Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Проблема также решается без Spring с помощью Java Service Providers.
https://docs.oracle.com/javase/tutorial/ext/basics/spi.html
Можно динамически подгружать реализации некоторого интерфейса и его билдера и выбирать их по какой-нибудь метаинформации без switch (итерируя доступные в рантайме и выбирая нужную).
@SuppressWarnings("unchecked")
@Component
public class RequestBuildersFactoryImpl implements RequestBuildersFactory {
@Setter(onMethod = @__(@Autowired))
private List<RequestBuilder> builders;
public <T extends Transfer> BaseRequest<T> transferToRequest(T transfer) {
ResolvableType type = ResolvableType.forClassWithGenerics(RequestBuilder.class, transfer.getClass());
RequestBuilder<T> builder = builders.stream().filter(b -> type::isInstance).findFirst().get();
return builder.createRequest(transfer, stage);
}
}
Generics + Spring: Да пребудет с вами сила