рдУрдУрдкреА рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдПрдХ рд╣реА рдХреНрд░рдо рдореЗрдВ рдкрдврд╝рд╛ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ рдФрд░ рд╣рд░ рдХреЛрдИ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд░рд╣рд╛ рд╣реИред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдХреНрд░рдо рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд╛ рдХреНрд░рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХреЙрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдХреЛрдб рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИред


рдПрдХ рдмрд╛рд░, рдПрдХ рд╕рдорд╛рди рдХреЛрдб рдиреЗ рдореЗрд░реА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝ рд▓рд┐рдпрд╛ред


рд╕рдорд╕реНрдпрд╛


рдПрдХ рдмрд╛рд░, рдПрдХ рд╕рдВрдпреБрдХреНрдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рдореЗрдВ рдЗрдзрд░-рдЙрдзрд░ рддрд╛рдХрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЦреЛрдЬ рдХреА:


public Product fill(Product product, Images images, Prices prices, Availabilities availabilities){ priceFiller.fill(product, prices); //do not move this line below availabilityFiller call, availabilities require prices availabilityFiller.fill(product, availabilities); imageFiller.fill(product, images); return product; } 

рдмреЗрд╢рдХ, рд╕рдмрд╕реЗ "рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг" рд╢реИрд▓реА рдЖрдкрдХреА рдЖрдВрдЦ рдХреЛ рдирд╣реАрдВ рдкрдХрдбрд╝рддреА рд╣реИ: рдХрдХреНрд╖рд╛рдПрдВ рд╕реНрдЯреЛрд░ рдбреЗрдЯрд╛ (рдкреАрдУрдЬреЗрдУ), рдлрд╝рдВрдХреНрд╢рди рдЖрдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрджрд▓ рджреЗрддреА рд╣реИрдВ ...


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕реНрд╡рдпрдВ рдбреЗрдЯрд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ (рд╕реЗрд╡рд╛рдУрдВ) рд╕реЗ рдЖрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЕрдм рд╣рдо рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬрдЧрд╣ рджреЗрдВрдЧреЗред


рд▓реЗрдХрд┐рди рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВред


  1. рдореИрдВ рдЗрд╕ рддрдереНрдп рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдПрдлрдкреА рдХреА рд╢реИрд▓реА рдореЗрдВ рдПрдХ рднреА рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
    • рд▓реЗрдХрд┐рди рдмрддрд╛ рджреЗрдВ рдХрд┐ рдРрд╕рд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдордп рдФрд░ рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
  2. рдХреЛрдб рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХрд╣рддреА рд╣реИ рдХрд┐ рдХреЙрд▓ рдХрд╛ рдХреНрд░рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдФрд░ рдирдП Filler рдПрдореНрдмреЗрдб рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП
    • рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 1 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ рдФрд░ рд╣рд░ рдХреЛрдИ рдЗрд╕ рдЯреНрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдЯреАрдо рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирдП рд▓реЛрдЧ (рдЙрджреНрдпрдо рдореЗрдВ рдЬрд░реВрд░реА рдирд╣реАрдВ)ред

рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдиреЗ рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд╣рд░рд╛ рджрд┐рдпрд╛ред рдЖрдЦрд┐рд░рдХрд╛рд░, рдПрдкреАрдЖрдИ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреНрдпрд╛ рдмрджрд▓рд╛рд╡ рдЖрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ Product::getImages рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ fill рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧреА, рдФрд░ рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдЙрддреНрдкрд╛рдж рдХреЗ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреАред


Filler рд╕рд╛рде Filler рдЪреАрдЬреЗрдВ рдФрд░ рднреА рдЦрд░рд╛рдм рд╣реИрдВред AvailabilityFiller рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдорд╛рд▓ рдХреА рдХреАрдордд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╡рд╕реНрддреБ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╣реИред


рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЧрд▓рдд рдЙрдкрдпреЛрдЧ рд╕реЗ рдХреИрд╕реЗ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реВрдВред


рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рдорд╛рдорд▓реЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рднреА рд╕рдорд╛рдзрд╛рди рдореБрдЭреЗ рд╕рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реАрдВ рд▓рдЧрддреЗ рдереЗред


RuntimeException


рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛: рдФрд░ рдЖрдк рдлрд╝рдВрдХреНрд╢рди Objects.requireNonNull(product.getPrices) рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ Objects.requireNonNull(product.getPrices) рдФрд░ рдлрд┐рд░ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рджреМрд░рд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреАред


  • рд▓реЗрдХрд┐рди рдХреАрдордд рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдпрджрд┐ рд╕реЗрд╡рд╛ рдЕрдиреБрдкрд▓рдмреНрдз рдереА рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдЧрд▓рддреА рдереА, рддреЛ рдЙрддреНрдкрд╛рдж рдХреЛ "рд╕реНрдЯреЙрдХ рд╕реЗ рдмрд╛рд╣рд░" рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ "рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛" рдХреЛ "рдЕрдиреБрд░реЛрдзрд┐рдд рднреА рдирд╣реАрдВ" рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЭрдВрдбреЗ рдпрд╛ рдХреБрдЫ рднреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред
    • рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ getPrices рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдзреБрдирд┐рдХ рдЬрд╛рд╡рд╛ рдХреЗ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░реЗрдВрдЧреЗ
      • рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рд╕реВрдЪреА рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреА рдЧрдИ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдПрдкреАрдЖрдИ рдореЗрдВ рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ ... рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдирдП рдмрдирд╛рдПрдВред рд▓реЗрдХрд┐рди рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрджрд┐ рдпрд╣ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕реВрдЪреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдХрд▓реЗрдХреНрдЯрд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЧрдИред
  • рдЕрдЧрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ AvailabilityFiller рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЬрд┐рд╕рдиреЗ рдХреЙрд▓ рд▓рд┐рдЦрд╛ рд╣реИ рд╡рд╣ рддреБрд░рдВрдд рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдПрдЧрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИред рд▓реЙрдиреНрдЪ рдФрд░ рдбреЗрдмреНрдпреВ рдХреЗ рдмрд╛рдж рд╣реАред рдлрд┐рд░ рдЙрд╕реЗ рдЕрднреА рднреА рдХреЛрдб рдХреЛ рд╕рдордЭрдирд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХрд╣рд╛рдВ рдорд┐рд▓реЗрдЧрд╛ред

рдХрд╕реМрдЯреА


"рдФрд░ рдЖрдк рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдХреЙрд▓ рдХреЗ рдХреНрд░рдо рдХреЛ рдмрджрд▓рдиреЗ рдкрд░ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред" рдпрд╛рдиреА рдпрджрд┐ рд╕рднреА Filler рдПрдХ "рдирдпрд╛" рдЙрддреНрдкрд╛рдж рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рдХреБрдЫ рд╣реЛрдЧрд╛:


 given(priceFillerMock.fill(eq(productMock), any())).willReturn(productWithPricesMock); given(availabilityFillerMock.fill(eq(productMockWithPrices), any())).willReturn(productMockWithAvailabilities); given(imageFillerMock.fill(eq(productMockWithAvailabilities), any())).willReturn(productMockWithImages); var result = productFiller.fill(productMock, p1, p2, p3); assertThat("unexpected return value", result, is(productMockWithImages)); 

  • рдореБрдЭреЗ рдРрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ "рд╡реНрд╣рд╛рдЗрдЯ-рдмреЙрдХреНрд╕" рд╣реИрдВ
  • рд╣рд░ рдирдП Filler рд╕рд╛рде рдмреНрд░реЗрдХ
  • рдпрд╣ рд╕реНрд╡рддрдВрддреНрд░ рдХреЙрд▓ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ
  • рджреЛрдмрд╛рд░рд╛, рдпрд╣ AvailabilityFiller рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдпрд╛рд╕


рд╡рд┐рдЪрд╛рд░


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ рдореИрдВ рд╕рдВрдХрд▓рди рд╕реНрддрд░ рдкрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЦреИрд░, рдореБрдЭреЗ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдПрдХ рдкреВрдЫрддрд╛ рд╣реИ, рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдХрд▓рд┐рдд рднрд╛рд╖рд╛ рдпрджрд┐ рдореИрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рд░реЛрдХ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реВрдВред


рдФрд░ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдХреНрдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдХреЗ рдмрд┐рдирд╛ рдХреЛрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд" рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рд╣реА рд╡рд░реНрдЧ рдХреЗ рд╣реИрдВ?


рдХреНрдпрд╛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрднрд╛рд╡рд┐рдд рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рдпрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░рдирд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реЛрдЧрд╛?


рддреЛ рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рдерд╛:


 public Product fill(<? extends BaseProduct> product, Images images, Prices prices, Availabilities availabilities){ var p1 = priceFiller.fill(product, prices); var p2 = availabilityFiller.fill(p1, availabilities); return imageFiller.fill(p2, images); } PriceFiller public ProductWithPrices fill(<? extends BaseProduct> product, Prices prices) AvailabilityFiller public ProductWithAvailabilities fill(<? extends ProductWithPrices> product, Prices prices)  public <BaseProduct & PriceAware & AvailabilityAware> fill(<? extends BaseProduct & PriceAware> product, Prices prices) 

рдпрд╛рдиреА рдореВрд▓ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЙрддреНрдкрд╛рдж рд▓реМрдЯрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рджрд┐рдЦрд╛рддрд╛ рд╣реИред


Filler , рдЕрдкрдиреЗ API рдореЗрдВ, рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕ рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╡реЗ рдХреНрдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред


рдЗрд╕ рддрд░рд╣ рдЖрдк рдЧрд▓рдд рдХреЙрд▓ рдЕрдиреБрдХреНрд░рдо рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЬрд╛рд╡рд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХреИрд╕реЗ рдХрд░реЗрдВ? (рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ рдХрдИ рд╡рд░реНрдЧреЛрдВ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред)


рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд╕рдВрдЪрд╛рд▓рди рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдХреАрдорддреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рднреАред
рддрдм рд╢рд╛рдпрдж


 class ProductWithImages extends BaseProduct implements ImageAware{} class ProductWithImagesAndPrices extends BaseProduct implements ImageAware, PriceAware{} class Product extends BaseProduct implements ImageAware, PriceAware, AvailabilityAware{} 

рдпрд╣ рд╕рдм рдХреИрд╕реЗ рд╡рд░реНрдгрди рдХрд░реЗрдВ?


рдПрдбреЗрдкреНрдЯрд░ рдмрдирд╛рдПрдВ?


 public ProductWithImagesAndPrices(<? extends BaseProduct & PriceAware> base){ this.base = base; this.images = Collections.emptyList(); } public long getId(){ return this.base.getId(); } public Price getPrice(){ return this.base.getPrice(); } public List<Image> getImages(){ return this.images; } 

рдХреЙрдкреА рдбрд╛рдЯрд╛ / рд▓рд┐рдВрдХ?


 public ProductWithImagesAndPrices(<? extends BaseProduct & PriceAware> base){ this.id = base.getId(); this.prices = base.getPrices(); this.images = Collections.emptyList(); } public List<Image> getImages(){ return this.images; } 

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдпрд╣ рд╕рдм рдХреЛрдб рдХреА рдПрдХ рдмрдбрд╝реА рд░рд╛рд╢рд┐ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ 3 рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдХрдИ рдФрд░ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред


рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рд▓рд╛рдЧрдд рдЦреБрдж рдХреЛ рд╕рд╣реА рдирд╣реАрдВ рдард╣рд░рд╛рддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд░рд╛рдЬреНрдп рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдореБрдЭреЗ рдмрд╣реБрдд рдЖрдХрд░реНрд╖рдХ рд▓рдЧрд╛ред


рдкреАрдЫреЗ рд╣рдЯрдирд╛


рдпрджрд┐ рдЖрдк рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╣реАрдВ рдирд╣реАрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреЛ рдореЗрдВ рдЖрдк "рдХреЙрдкреА" рдпрд╛ "рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ" рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЧреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ

рдПрдХ рдФрд░ рд╡рд┐рд╖рдпрд╛рдВрддрд░


рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди Proxy рд╕рд╛рде рдЖрдпрд╛, рдЬрд┐рд╕рдиреЗ рдХреЗрд╡рд▓ рдирдП рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрд▓рд╛рдпрд╛, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдбрд░рд╛рд╡рдирд╛, рдЧреБрд╕реНрд╕рд╛ рдФрд░ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЕрдЪрд╛рдирдХ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ:

рдмрд┐рд╕реНрддрд░ рдкрд░ рдЬрд╛рдиреЗ рдФрд░ рдЦрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ
 public class Application { public static void main(String[] args) { var baseProduct = new BaseProductProxy().create(new BaseProductImpl(100L)); var productWithPrices = fillPrices(baseProduct, BigDecimal.TEN); var productWithAvailabilities = fillAvailabilities(productWithPrices, "available"); var productWithImages = fillImages(productWithAvailabilities, List.of("url1, url2")); var product = productWithImages; System.out.println(product.getId()); System.out.println(product.getPrice()); System.out.println(product.getAvailability()); System.out.println(product.getImages()); } static <T extends BaseProduct> ImageAware fillImages(T base, List<String> images) { return (ImageAware) Proxy.newProxyInstance(base.getClass().getClassLoader(), new Class[]{ImageAware.class, BaseProduct.class}, new MyInvocationHandler<>(base, new ImageAware() { @Override public List<String> getImages() { return images; } })); } static <T extends BaseProduct> PriceAware fillPrices(T base, BigDecimal price) { return (PriceAware) Proxy.newProxyInstance(base.getClass().getClassLoader(), new Class[]{PriceAware.class}, new MyInvocationHandler<>(base, new PriceAware() { @Override public BigDecimal getPrice() { return price; } })); } static AvailabilityAware fillAvailabilities(PriceAware base, String availability) { return (AvailabilityAware) Proxy.newProxyInstance(base.getClass().getClassLoader(), new Class[]{AvailabilityAware.class}, new MyInvocationHandler<>(base, new AvailabilityAware() { @Override public String getAvailability() { return base.getPrice().intValue() > 0 ? availability : "sold out"; } })); } static class BaseProductImpl implements BaseProduct { private final long id; BaseProductImpl(long id) { this.id = id; } @Override public long getId() { return id; } } static class BaseProductProxy { BaseProduct create(BaseProduct base) { return (BaseProduct) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{BaseProduct.class}, new MyInvocationHandler<>(base, base)); } } public interface BaseProduct { default long getId() { return -1L; } } public interface PriceAware extends BaseProduct { default BigDecimal getPrice() { return BigDecimal.ZERO; } } public interface AvailabilityAware extends PriceAware { default String getAvailability() { return "sold out"; } } public interface ImageAware extends AvailabilityAware { default List<String> getImages() { return Collections.emptyList(); } } static class MyInvocationHandler<T extends BaseProduct, U extends BaseProduct> implements InvocationHandler { private final U additional; private final T base; MyInvocationHandler(T base, U additional) { this.additional = additional; this.base = base; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (Arrays.stream(additional.getClass().getInterfaces()).anyMatch(i -> i == method.getDeclaringClass())) { return method.invoke(additional, args); } var baseMethod = Arrays.stream(base.getClass().getMethods()).filter(m -> m.getName().equals(method.getName())).findFirst(); if (baseMethod.isPresent()) { return baseMethod.get().invoke(base, args); } throw new NoSuchMethodException(method.getName()); } } } 

рдирд┐рд╖реНрдХрд░реНрд╖


рдХреНрдпрд╛ рдирд┐рдХрд▓рд╛? рдПрдХ рдУрд░, рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рдХреЛ "рдСрдмреНрдЬреЗрдХреНрдЯ" рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХреЗ рдЧрд▓рдд рдЕрдиреБрдХреНрд░рдо рдХреЗ рдХрд╛рд░рдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд░реЛрдХрдерд╛рдо рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред


рджреВрд╕рд░реА рдУрд░, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдЗрддрдирд╛ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рддреБрд░рдВрдд рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдвреЗрд░ рдХреЗрд╡рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИред


рдореЗрд░реА рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореИрдВрдиреЗ рдЕрднреА рднреА рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдФрд░ рдкрд╣рд▓реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реНрддрд░ рдкрд░, рд╕рдм рдХреБрдЫ рдареАрдХ рдерд╛ред рдореИрдВрдиреЗ рдХрд╛рд░реНрдп рд▓рд┐рдЦреЗ:


 <T extends Foo> List<T> firstStep(List<T> ts){} <T extends Foo & Bar> List<T> nStep(List<T> ts){} <T extends Foo> List<T> finalStep(List<T> ts){} 

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрджрдо рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдпрд╛ рдЙрд╕рдХреЗ рдЕрдВрдд рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред


mock рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 'рдФрд░, рдореИрдВ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рд▓реЗрдХрд┐рди рдЬрдм рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдбреЗрдЯрд╛ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдмрдврд╝рдиреЗ рд▓рдЧреА, рддреЛ рдореИрдВрдиреЗ рдЬрд▓реНрджреА рд╕реЗ рд╕рдм рдХреБрдЫ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдФрд░ рд╕рдмрдХреБрдЫ "рд╕рд╛рдорд╛рдиреНрдп" рд░реВрдк рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ред рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреА рджрдХреНрд╖рддрд╛ рдФрд░ рд╕рд░рд▓рддрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА "рд░реЛрдХрдерд╛рдо" рдкрд░ рд╡рд┐рдЬрдп рдкрд╛рддреА рд╣реИ, рдФрд░ рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХреЗ рд╕рд╣реА рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рддреНрд░реБрдЯрд┐ рдореИрдиреНрдпреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рд╣реА рдкреНрд░рдХрдЯ рд╣реЛред


рд╢рд╛рдпрдж рдЕрдЧрд░ рдореИрдВрдиреЗ рдПрдХ рдХрджрдо рдкреАрдЫреЗ рд▓реЗ рд▓рд┐рдпрд╛ рдФрд░ рджреВрд╕рд░реА рддрд░рдл рд╕реЗ рдХреЛрдб рдХреЛ рджреЗрдЦрд╛, рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕рдорд╛рдзрд╛рди рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдЯрд┐рдкреНрдкрдгреА рд▓рд╛рдЗрди рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛ рдЧрдИред


рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реБрдП рдХрд┐ рдЪреВрдВрдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдмрд╕рдиреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдк Builder рдХреЗ рд░реВрдк рдореЗрдВ рдЙрддреНрдкрд╛рдж рдбреЗрдЯрд╛ рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреЗрддрд╛ рд╣реИред рдлрд┐рд░, рдпрд╣ рд╕рдм рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рддрд░реНрдХ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред


рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЬрд╛рддрд╛ рд╣реИ:


рдмрд┐рд▓реНрдбрд░-рдкреИрдЯрд░реНрди рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдзрд╛рди
 public class Application_2 { public static void main(String[] args) { var product = new Product.Builder() .id(1000) .price(20) .availability("available") .images(List.of("url1, url2")) .build(); System.out.println(product.getId()); System.out.println(product.getAvailability()); System.out.println(product.getPrice()); System.out.println(product.getImages()); } static class Product { private final int price; private final long id; private final String availability; private final List<String> images; private Product(int price, long id, String availability, List<String> images) { this.price = price; this.id = id; this.availability = availability; this.images = images; } public int getPrice() { return price; } public long getId() { return id; } public String getAvailability() { return availability; } public List<String> getImages() { return images; } public static class Builder implements ProductBuilder, ProductWithPriceBuilder { private int price; private long id; private String availability; private List<String> images; @Override public ProductBuilder id(long id) { this.id = id; return this; } @Override public ProductWithPriceBuilder price(int price) { this.price = price; return this; } @Override public ProductBuilder availability(String availability) { this.availability = availability; return this; } @Override public ProductBuilder images(List<String> images) { this.images = images; return this; } public Product build(){ var av = price > 0 && availability != null ? availability : "sold out"; return new Product(price, id, av, images); } } public interface ProductBuilder { ProductBuilder id(long id); ProductBuilder images(List<String> images); ProductWithPriceBuilder price(int price); Product build(); } public interface ProductWithPriceBuilder{ ProductBuilder availability(String availability); } } } 

рддрд╛рдХрд┐:


  • рд╕рд╛рдл рд╕реБрдерд░реА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд▓рд┐рдЦрд┐рдП
  • рд╕реБрдВрджрд░ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХреЛрдб рд▓рд┐рдЦреЗрдВ
  • рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдПрдХ рдмрд╣рди рд╣реИ рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
  • рдмреЗрдЭрд┐рдЭрдХ рдЪреАрдЬреЛрдВ рдкрд░ рд╕рд╡рд╛рд▓ рдХрд░реЗрдВ, рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рднреА рдлреЗрдВрдХ рджреЗрдВ
  • рдЪреБрдк рдордд рд░рд╣реЛ! рдЬрдм рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреВрд╕рд░реЛрдВ рдХреЛ рд╕рдордЭрд╛рддреЗ рд╣реИрдВ, рддреЛ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдкреИрджрд╛ рд╣реЛрддреЗ рд╣реИрдВ (рд░рдмрд░ рдбрдХ рдбреНрд░рд┐рд╡реЗрди рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ)

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/hi478826/


All Articles