рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рджреВрд░, рджреВрд░ рдХреЗ рдмреИрдВрдХ ...
рд╢реБрдн рджрд┐рди, рд╣реИрдмреНрд░ред рдЖрдЬ, рдЖрдЦрд┐рд░рдХрд╛рд░, рдореЗрд░реЗ рд╣рд╛рде рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдкрд╣реБрдВрдЪреЗред рд▓реЗрдХрд┐рди рдкрд┐рдЫрд▓реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ - рд▓реЗрдЦреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рдЖрдЬ рдореИрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдРрд╕реЗ рддрдВрддреНрд░ рдХреА рд╢рдХреНрддрд┐ рдХреЛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рд╡рд╕рдВрдд рдЬрд╛рджреВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдФрд░ рднреА рдордЬрдмреВрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдЪреЗрддрд╛рд╡рдиреА рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд▓реЗрдЦ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧрд┐рдВрдЧ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдЬреЛ "рдЬреЗрдирд░рд┐рдХ рд╣реИрдВ, рдареАрдХ рд╣реИ, рдЬреЛ рд╣рдо ArrayList рдореЗрдВ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ"ред
рдПрдкрд┐рд╕реЛрдб 1:
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд╛рдо рдкрд░ рдореЗрд░рд╛ рдХрд╛рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдерд╛: рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЖрдо рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдзрди рд╣рд╕реНрддрд╛рдВрддрд░рдг рд╣реЛрддрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд╡рд╛рдж рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддрд╛ рд╣реИ - рдПрдХ рд░рд╛рдЬреНрдп рд╕реЗ рджреВрд╕рд░реЗ рд░рд╛рдЬреНрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдФрд░ рджреВрд╕рд░реЗ рдПрдкреАрдЖрдИ рдореЗрдВ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзред рддрджрдиреБрд╕рд╛рд░, рдРрд╕реЗ рдмрд┐рд▓реНрдбрд░ рдереЗ рдЬреЛ рд░реВрдкрд╛рдВрддрд░рдг рдореЗрдВ рд▓рдЧреЗ рд╣реБрдП рдереЗред
рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдХрдХреНрд╖рд╛рдПрдВ рдорд┐рд▓реАрдВ:
public class Transfer { private TransferType transferType; ... } public enum TransferType { INTERNAL, SWIFT, ...; } public class InternalTransfer extends Transfer { ... } public class BaseRequest { ... } public class InternalRequest extends BaseRequest { ... } ...
рдПрдкрд┐рд╕реЛрдб 2:
рддрдм рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдереА - рдЙрди рд╕рднреА рдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рддрд░реАрдХреЗ рдереЗ - рдЪреЗрдХрдЯреНрд░рд╛рдВрд╕рдлрд░, рдЕрдкреНрд░реВрд╡рдЯреНрд░рд╛рдВрд╕рдлрд░, рдЖрджрд┐ред рдпрд╣рд╛рдВ, рдкрд╣рд▓реА рдмрд╛рд░, рд▓реЗрдХрд┐рди рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдирд╣реАрдВ, рдЬреЗрдиреЗрд░рд┐рдХ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдереЗ: рдореИрдВрдиреЗ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдпрд╛, рдФрд░ рдмрд╛рдХреА рдХреЛ рдЗрд╕рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛:
@AllArgsConstructor public class TransferController<T extends Transfer> { private final TransferService<T> service; public CheckResponse checkTransfer(@RequestBody @Valid T payment) { return service.checkTransfer(payment); } ... } public class InternalTransferController extends TransferController<InternalTransfer> { public InternalTransferController(TransferService<InternalTransfer> service) { super(service); } }
рдЦреИрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реЗрд╡рд╛:
public interface TransferService<T extends Transfer> { CheckResponse checkTransfer(T payment); ApproveResponse approveTransfer(T payment); ... }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗрд╡рд▓ рд╕реБрдкрд░рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╣реЛ рдЧрдИ рдереА, рдФрд░ рд╕реЗрд╡рд╛ рдореЗрдВ рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдЗрд╕реЗ рдЦреЛ рджреЗрддреЗ рдереЗред
рд▓реЗрдХрд┐рди!
рдПрдкрд┐рд╕реЛрдб 3:
рд╕реЗрд╡рд╛ рдХреЗ рдЕрдВрджрд░ рдЕрднреА рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рдереА:
рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╡рд┐рднрд┐рдиреНрди рдмрд┐рд▓реНрдбрд░реЛрдВ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдерд╛:
RequestBuilder builder; switch (type) { case INTERNAL: { builder = beanFactory.getBean(InternalRequestBuilder.class); break; } case SWIFT: { builder = beanFactory.getBean(SwiftRequestBuilder.class); break; } default: { log.info("Unknown payment type"); throw new UnknownPaymentTypeException(); } }
рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдмрд┐рд▓реНрдбрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕:
public interface RequestBuilder<T extends BaseRequest, U extends Transfer> { T createRequest(U transfer); }
рдлрд╝реИрдХреНрдЯрд░реА рдкрджреНрдзрддрд┐ рдпрд╣рд╛рдБ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдЖрдИ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реНрд╡рд┐рдЪ / рдХреЗрд╕ рдПрд╕ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ рд╣реИрдВред рдпрд╣ рдмреЗрд╣рддрд░ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдПрдХ рд╣реА рдереА - рдЬрдм рдЖрдк рдПрдХ рдирдпрд╛ рдЕрдиреБрд╡рд╛рдж рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рднрд╛рд░реА рд╕реНрд╡рд┐рдЪ / рдорд╛рдорд▓рд╛ рдореБрдЭреЗ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдПрдкрд┐рд╕реЛрдб 4:
рдХреНрдпрд╛ рд░рд╛рд╕реНрддрд╛ рдерд╛? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдореБрдЭреЗ рдХрдХреНрд╖рд╛ рдХреЗ рдирд╛рдо рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рдмрд┐рд▓реНрдбрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдЖ, рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛ рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдПрдХ рдмреЗрд╣рддрд░ рдЙрдкрд╛рдп рдерд╛ред рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╡реЗрджрди рдХреЗ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХрд╛ рдореБрдЦреНрдп рдкрд╣рд▓реВ рд╕реНрд╡рдпрдВ рдЕрдиреБрд╡рд╛рдж рд╣реИред рдпрд╛рдиреА рдЕрдЧрд░ рдХреЛрдИ рдирд╣реАрдВ рд╣реИрдВ рддреЛ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рддреЛ рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЯрд╛рдИ? рдпрд╣ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдФрд░ рдлрд┐рд░ рд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддреЗ рд╣реИрдВред
рдЕрдиреБрд░реЛрдз рдХрдХреНрд╖рд╛рдПрдВ:
public class BaseRequest<T extends Transfer> { ... } public class InternalRequest extends BaseRequest<InternalTransfer> { ... }
рдФрд░ рдмрд┐рд▓реНрдбрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕:
public interface RequestBuilder<T extends Transfer> { BaseRequest<T> createRequest(T transfer); }
рдФрд░ рдпрд╣рд╛рдБ рдпрд╣ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд╣рдорд╛рд░рд╛ рд╕рд╛рдордирд╛ рдЬреЗрдирд░рд┐рдХ рдХреА рдПрдХ рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд▓рдЧрднрдЧ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмреЗрд╕реНрд░рд┐рд╕реНрдлреЗрд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдЗрд╕рдХреЗ рд╡рд╛рд░рд┐рд╕ рдХреЛ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЯрд╛рдЗрдк рдЯреА рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН:
public class InternalRequestBuilder implements RequestBuilder<InternalTransfer> { @Override public InternalRequest createRequest(InternalTransfer transfer) { return InternalRequest.builder() ... .build(); } }
рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдордиреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕реБрдзрд╛рд░ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕реНрд╡рд┐рдЪ / рдХреЗрд╕ рдХреА рд╕рдорд╕реНрдпрд╛ рдЕрднреА рддрдХ рд╣рд▓ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдпрд╛ ...?
рдПрдкрд┐рд╕реЛрдб 5:
рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╡рд╕рдВрдд рдЬрд╛рджреВ рдЦреЗрд▓рдиреЗ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕
getBeanNamesForType (ResolvableType рдкреНрд░рдХрд╛рд░) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рдмрд┐рди рдирд╛рдореЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдФрд░
ResolvableType рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐
forClassWithGenerics (Class <?> Clazz, Class <!> ... generics) рд╣реИ , рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рдкреНрд░рдердо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ class (рдЗрдВрдЯрд░рдлрд╝реЗрд╕) рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЯреА рдИ:
ResolvableType type = ResolvableType.forClassWithGenerics(RequestBuilder.class, transfer.getClass());
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
RequestBuilder<InternalTransfer>
рдФрд░ рдЕрдм рдереЛрдбрд╝рд╛ рдФрд░ рдЬрд╛рджреВ - рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╢реАрдЯ рдХреЛ рд╕реНрд╡рд╛рд╣рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛрдВрдЧреЗ:
private final List<RequestBuilder<T>> builders;
рд╣рдореЗрдВ рдмрд╕ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рд╣реИ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдЪреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреБрдХреНрдд рдвреВрдВрдврдирд╛ рд╣реИ:
builders.stream() .filter(b -> type.isInstance(b)) .findFirst() .get();
рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рдорд╛рди, рдЕрднреА рднреА ApplicationContext рдпрд╛ BeanFactory рдХреЛ рдСрдЯреЙрдЗрдпрд░ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ, рдФрд░ getBeanNamesForType () рд╡рд┐рдзрд┐ рдЙрди рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЦрд░рд╛рдм рд╕реНрд╡рд╛рдж рдХрд╛ рд╕рдВрдХреЗрдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ (рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП
zolt85 рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж)ред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░реЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд▓реЗрддрд╛ рд╣реИ:
@Component @AllArgsConstructor public class RequestBuildersFactory<T extends Transfer> { private final List<RequestBuilder<T>> builders; public BaseRequest<T> transferToRequest(T transfer) { ResolvableType type = ResolvableType.forClassWithGenerics(RequestBuilder.class, transfer.getClass()); RequestBuilder<T> builder = builders.stream() .filter(b -> type.isInstance(b)) .findFirst() .get(); return builder.createRequest(transfer, stage); } }
рдПрдкрд┐рд╕реЛрдб 6: рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реБрд╡рд┐рдЪрд╛рд░рд┐рдд рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдорд┐рдиреА-рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ, рдЬреЛ рд╕рднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрд╕рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд╣рдордиреЗ рдмреЛрдЭрд┐рд▓ рд╕реНрд╡рд┐рдЪ / рдорд╛рдорд▓реЗ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓рд┐рдпрд╛ рдФрд░ рдирдП рдЕрдиреБрд╡рд╛рдж рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдореМрдЬреВрджрд╛ рдХрдХреНрд╖рд╛рдПрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреА, рдЬреЛ рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИред
рдкреБрдирд╢реНрдЪ:рдпрд╣ рд▓реЗрдЦ рдЬрд╣рд╛рдБ рднреА рд╕рдВрднрд╡ рдФрд░ рдЕрд╕рдВрднрд╡ рд╣реИ, рд╡рд╣рд╛рдВ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рдЖрдкрдХреЛ рдХреМрди рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рддрдВрддреНрд░ рдФрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдзрдиреНрдпрд╡рд╛рдж:рд╕реБрд▓реНрддрд╛рдирд╕реЛрдИ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдЗрд╕ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рдФрд░, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдпрд╣ рд▓реЗрдЦ рдирд╣реАрдВ рдерд╛ред
рд╕рдВрджрд░реНрдн:рдЧрд┐рддреБрдм рд╕реНрд░реЛрдд рдХреЛрдб