CodeGym/Java Blog/рдпрд╛рджреГрдЪреНрдЫрд┐рдХ/рд╡рд┐рд░реЛрдзреА рдирдореБрдиреЗ рдХрд╛рдп рдЖрд╣реЗрдд? рдЪрд▓рд╛ рдХрд╛рд╣реА рдЙрджрд╛рд╣рд░рдгреЗ рдкрд╛рд╣реВ (рднрд╛рдЧ рез)
John Squirrels
рдкрд╛рддрд│реА 41
San Francisco

рд╡рд┐рд░реЛрдзреА рдирдореБрдиреЗ рдХрд╛рдп рдЖрд╣реЗрдд? рдЪрд▓рд╛ рдХрд╛рд╣реА рдЙрджрд╛рд╣рд░рдгреЗ рдкрд╛рд╣реВ (рднрд╛рдЧ рез)

рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдпрд╛ рдЧреНрд░реБрдкрдордзреНрдпреЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреЗрд▓реЗ
рд╕рджрд╕реНрдп
рд╕рд░реНрд╡рд╛рдВрдирд╛ рд╢реБрдн рджрд┐рд╡рд╕! рджреБрд╕рд▒реНрдпрд╛ рджрд┐рд╡рд╢реА рдорд╛рдЭреА рдиреЛрдХрд░реАрдЪреА рдореБрд▓рд╛рдЦрдд рд╣реЛрддреА, рдЖрдгрд┐ рдорд▓рд╛ рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрдирдмрджреНрджрд▓ рдХрд╛рд╣реА рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рдгреНрдпрд╛рдд рдЖрд▓реЗ: рддреЗ рдХрд╛рдп рдЖрд╣реЗрдд, рдХреЛрдгрддреЗ рдкреНрд░рдХрд╛рд░ рдЖрд╣реЗрдд рдЖрдгрд┐ рдХреЛрдгрддреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдгреЗ рдЖрд╣реЗрдд. рдЕрд░реНрдерд╛рдд, рдореА рдпрд╛ рдкреНрд░рд╢реНрдирд╛рдЪреЗ рдЙрддреНрддрд░ рджрд┐рд▓реЗ, рдкрд░рдВрддреБ рдЕрдЧрджреА рд╡рд░рд╡рд░рдЪреЗ, рдХрд╛рд░рдг рдореА рдпрд╛рдкреВрд░реНрд╡реА рдпрд╛ рд╡рд┐рд╖рдпрд╛рдд рдЦреЛрд▓рд╡рд░ рдЧреЗрд▓реЗ рдирд╡реНрд╣рддреЗ. рдореБрд▓рд╛рдЦрддреАрдирдВрддрд░, рдореА рдЗрдВрдЯрд░рдиреЗрдЯ рдЪрд╛рд│рд╛рдпрд▓рд╛ рд╕реБрд░реБрд╡рд╛рдд рдХреЗрд▓реА рдЖрдгрд┐ рдпрд╛ рд╡рд┐рд╖рдпрд╛рдд рдореА рдЕрдзрд┐рдХрд╛рдзрд┐рдХ рдордЧреНрди рдЭрд╛рд▓реЛ. рд╡рд┐рд░реЛрдзреА рдирдореБрдиреЗ рдХрд╛рдп рдЖрд╣реЗрдд?  рдЪрд▓рд╛ рдХрд╛рд╣реА рдЙрджрд╛рд╣рд░рдгреЗ рдкрд╛рд╣реВ (рднрд╛рдЧ рез) - рез рдЖрдЬ рдореА рд╕рд░реНрд╡рд╛рдд рд▓реЛрдХрдкреНрд░рд┐рдп рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрдирдЪреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╣рдВрдЧрд╛рд╡рд▓реЛрдХрди рджреЗрдК рдЗрдЪреНрдЫрд┐рддреЛ рдЖрдгрд┐ рдХрд╛рд╣реА рдЙрджрд╛рд╣рд░рдгрд╛рдВрдЪреЗ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ. рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рд╣реЗ рд╡рд╛рдЪреВрди рддреБрдореНрд╣рд╛рд▓рд╛ рдпрд╛ рдХреНрд╖реЗрддреНрд░рд╛рдд рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реЗ рдЬреНрдЮрд╛рди рдорд┐рд│реЗрд▓. рдЪрд▓рд╛ рд╕реБрд░реВ рдХрд░реБрдпрд╛! рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрди рдореНрд╣рдгрдЬреЗ рдХрд╛рдп рдпрд╛рд╡рд░ рдЪрд░реНрдЪрд╛ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА, рдбрд┐рдЭрд╛рдЗрди рдкреЕрдЯрд░реНрди рдореНрд╣рдгрдЬреЗ рдХрд╛рдп рддреЗ рдЖрдард╡реВрдпрд╛. рдПрдХ рдбрд┐рдЭрд╛рдЗрди рдирдореБрдирд╛рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд┐рдЭрд╛рдЗрди рдХрд░рддрд╛рдирд╛ рдЙрджреНрднрд╡рдгрд╛рд▒реНрдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛ рдХрд┐рдВрд╡рд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдВрд╕рд╛рдареА рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд▓ рдЙрдкрд╛рдп рдЖрд╣реЗ. рдкрд░рдВрддреБ рдЖрдЬ рдЖрдкрдг рддреНрдпрд╛рдВрдЪреНрдпрд╛рдмрджреНрджрд▓ рдмреЛрд▓рдд рдирд╛рд╣реА, рддрд░ рддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рд░реБрджреНрдз - рд╡рд┐рд░реЛрдзреА рдирдореБрдиреЗ рдмреЛрд▓рдд рдЖрд╣реЛрдд. рдЕрдБрдЯреА -рдкреЕрдЯрд░реНрди рд╣рд╛ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдкрд░рдВрддреБ рдЕрдкреНрд░рднрд╛рд╡реА, рдзреЛрдХрд╛рджрд╛рдпрдХ рдЖрдгрд┐/рдХрд┐рдВрд╡рд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреБрддреНрдкрд╛рджрдХ рджреГрд╖реНрдЯреАрдХреЛрди рдЖрд╣реЗ. рджреБрд╕рд▒реНрдпрд╛ рд╢рдмреНрджрд╛рдВрдд, рд╣рд╛ рдЪреБрдХрд╛рдВрдЪрд╛ рдирдореБрдирд╛ рдЖрд╣реЗ (рдХрдзреАрдХрдзреА рд╕рд╛рдкрд│рд╛ рджреЗрдЦреАрд▓ рдореНрд╣рдЯрд▓реЗ рдЬрд╛рддреЗ). рдирд┐рдпрдорд╛рдиреБрд╕рд╛рд░, рд╡рд┐рд░реЛрдзреА рдирдореБрдиреЗ рдЦрд╛рд▓реАрд▓ рдкреНрд░рдХрд╛рд░рд╛рдВрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧрд▓реЗрд▓реЗ рдЖрд╣реЗрдд:
  1. рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд▓ рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрди - рд╣реЗ рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрди рддрдпрд╛рд░ рд╣реЛрддрд╛рдд рдХрд╛рд░рдг рд╕рд┐рд╕реНрдЯрдордЪреА рд░рдЪрдирд╛ рддрдпрд╛рд░ рдХреЗрд▓реА рдЬрд╛рддреЗ (рд╕рд╛рдорд╛рдиреНрдпрдд: рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЯрджреНрд╡рд╛рд░реЗ).
  2. рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди/рд╕рдВрдШрдЯрдирд╛рддреНрдордХ рд╡рд┐рд░реЛрдзреА рдирдореБрдиреЗ - рд╣реЗ рдкреНрд░рдХрд▓реНрдк рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдирд╛рддреАрд▓ рд╡рд┐рд░реЛрдзреА рдирдореБрдиреЗ рдЖрд╣реЗрдд, рд╕рд╣рд╕рд╛ рд╡рд┐рд╡рд┐рдз рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрд╛рдВрджреНрд╡рд╛рд░реЗ (рдХрд┐рдВрд╡рд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрд╛рдВрдЪреНрдпрд╛ рдЧрдЯрд╛рдВрдирд╛) рд╕рд╛рдордирд╛ рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧрддреЛ.
  3. рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯ рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрди - рд╣реЗ рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрди рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рджреНрд╡рд╛рд░реЗ рдкреНрд░рдгрд╛рд▓реА рд▓рд╛рдЧреВ рдХреЗрд▓реНрдпрд╛рдореБрд│реЗ рдЙрджреНрднрд╡рддрд╛рдд.
рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрдирдЪреА рд╕рдВрдкреВрд░реНрдг рд╢реНрд░реЗрдгреА рдЕрдзрд┐рдХ рд╡рд┐рд▓рдХреНрд╖рдг рдЖрд╣реЗ, рдкрд░рдВрддреБ рдЖрдореНрд╣реА рдЖрдЬ рддреНрдпрд╛ рд╕рд░реНрд╡рд╛рдВрдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдгрд╛рд░ рдирд╛рд╣реА. рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд╛рд╕рдХрд╛рдВрд╕рд╛рдареА, рддреЗ рдЦреВрдк рдЬрд╛рд╕реНрдд рдЕрд╕реЗрд▓. рд╕реБрд░реБрд╡рд╛рддреАрдЪреНрдпрд╛рд╕рд╛рдареА, рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╡рд┐рд░реЛрдзреА рдкреЕрдЯрд░реНрдирдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдпрд╛.

1. рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдЕрд░реНрдзрд╛рдВрдЧрд╡рд╛рдпреВ

рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЕрд░реНрдзрд╛рдВрдЧрд╡рд╛рдпреВрдХреНрд▓рд╛рд╕рд┐рдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд╡рд┐рд░реЛрдзреА рдирдореБрдирд╛ рдорд╛рдирд▓рд╛ рдЬрд╛рддреЛ. рдпрд╛рдд рдирд┐рдпреЛрдЬрдирд╛рджрд░рдореНрдпрд╛рди рдкрд░рд┐рд╕реНрдерд┐рддреАрдЪреЗ рдЕрддрд┐-рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рдЬреЗрдгреЗрдХрд░реВрди рдХреЛрдгрддрд╛рд╣реА рдирд┐рд░реНрдгрдп рдХрд┐рдВрд╡рд╛ рдХреГрддреА рдХреЗрд▓реА рдЬрд╛рдд рдирд╛рд╣реА, рдореВрд▓рдд: рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдардкреНрдк рд╣реЛрддреЗ. рд╣реЗ рдмрд░реНрдпрд╛рдЪрджрд╛ рдШрдбрддреЗ рдЬреЗрд╡реНрд╣рд╛ рдзреНрдпреЗрдп рдкреВрд░реНрдгрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреЗ рдЖрдгрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛рд▓рд╛рд╡рдзреА рджрд░рдореНрдпрд╛рди рдкреВрд░реНрдгрдкрдгреЗ рд╕рд░реНрд╡рдХрд╛рд╣реА рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрдгреЗ рдЖрд╣реЗ. рд╣реЗ рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрди рд╡рд░реНрддреБрд│рд╛рдд рдЪрд╛рд▓рдгреЗ (рдПрдХ рд░рди-рдСрдл-рдж-рдорд┐рд▓ рдмрдВрдж рд▓реВрдк), рд╕реБрдзрд╛рд░рд┐рдд рдХрд░рдгреЗ рдЖрдгрд┐ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдореЙрдбреЗрд▓ рддрдпрд╛рд░ рдХрд░рдгреЗ, рдЬреНрдпрд╛рдореБрд│реЗ рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣рд╛рдд рд╡реНрдпрддреНрдпрдп рдпреЗрддреЛ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рддреБрдореНрд╣реА рдПрдХрд╛ рд╕реНрддрд░рд╛рд╡рд░ рдЧреЛрд╖реНрдЯреАрдВрдЪрд╛ рдЕрдВрджрд╛рдЬ рд▓рд╛рд╡рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рдд рдЖрд╣рд╛рдд: рдкрд░рдВрддреБ рдЬрд░ рдПрдЦрд╛рджреНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд▓рд╛ рдЕрдЪрд╛рдирдХ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдирд╛рд╡рд╛рдЪреНрдпрд╛ рдЪреМрдереНрдпрд╛ рдЖрдгрд┐ рдкрд╛рдЪрд╡реНрдпрд╛ рдЕрдХреНрд╖рд░рд╛рдВрдЪреНрдпрд╛ рдЖрдзрд╛рд░реЗ рдХрд░реНрдордЪрд╛рд░реНтАНрдпрд╛рдВрдЪреА рдпрд╛рджреА рддрдпрд╛рд░ рдХрд░рд╛рдпрдЪреА рдЕрд╕реЗрд▓, рдЬреНрдпрд╛рдордзреНрдпреЗ рддреНрдпрд╛рдВрдиреА рд╕рд░реНрд╡рд╛рдд рдЬрд╛рд╕реНрдд рдХрд╛рдорд╛рдЪреЗ рддрд╛рд╕ рдШрд╛рд▓рд╡рд▓реЗ рддреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдВрдЪреНрдпрд╛ рд╕реВрдЪреАрд╕рд╣ рдЧреЗрд▓реНрдпрд╛ рдЪрд╛рд░ рд╡рд░реНрд╖рд╛рдВрдд рдирд╡реАрди рд╡рд░реНрд╖ рдЖрдгрд┐ рдЖрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдп рдорд╣рд┐рд▓рд╛ рджрд┐рдирд╛рджрд░рдореНрдпрд╛рди? рдереЛрдбрдХреНрдпрд╛рдд, рддреЗ' рдЦреВрдк рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЖрд╣реЗ. рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЕрд░реНрдзрд╛рдВрдЧрд╡рд╛рдпреВрд╢реА рд▓рдврдгреНрдпрд╛рд╕рд╛рдареА рдпреЗрдереЗ рдХрд╛рд╣реА рдЯрд┐рдкрд╛ рдЖрд╣реЗрдд:
  1. рддреБрдореНрд╣рд╛рд▓рд╛ рджреАрд░реНрдШрдХрд╛рд▓реАрди рдЙрджреНрджрд┐рд╖реНрдЯ рд╣реЗ рдирд┐рд░реНрдгрдп рдШреЗрдгреНрдпрд╛рдЪрд╛ рдПрдХ рджрд┐рд╡рд╛ рдореНрд╣рдгреВрди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЬреЗрдгреЗрдХрд░реВрди рддреБрдордЪрд╛ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрдгрдп рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реНрддрдмреНрдз рд╣реЛрдгреНрдпрд╛рдРрд╡рдЬреА рдзреНрдпреЗрдпрд╛рдЪреНрдпрд╛ рдЬрд╡рд│ рдШреЗрдКрди рдЬрд╛рдИрд▓.
  2. рдХреНрд╖реБрд▓реНрд▓рдХ рдЧреЛрд╖реНрдЯреАрдВрд╡рд░ рд▓рдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВ рдирдХрд╛.
  3. рдирд┐рд░реНрдгрдпрд╛рд╕рд╛рдареА рдЕрдВрддрд┐рдо рдореБрджрдд рд╕реЗрдЯ рдХрд░рд╛.
  4. рдПрдЦрд╛рджреЗ рдХрд╛рд░реНрдп рдЙрддреНрддрдо рдкреНрд░рдХрд╛рд░реЗ рдкреВрд░реНрдг рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВ рдирдХрд╛ - рддреЗ рдЪрд╛рдВрдЧрд▓реЗ рдХрд░рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ.
рдпреЗрдереЗ рдЦреВрдк рдЦреЛрд▓рд╡рд░ рдЬрд╛рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА, рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рдЗрддрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХреАрдп рд╡рд┐рд░реЛрдзреА рдирдореБрдиреНрдпрд╛рдВрдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдгрд╛рд░ рдирд╛рд╣реА. рдореНрд╣рдгреВрди, рдХреЛрдгрддреНрдпрд╛рд╣реА рдкрд░рд┐рдЪрдпрд╛рд╢рд┐рд╡рд╛рдп, рдЖрдореНрд╣реА рдХрд╛рд╣реА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд▓ рдЕрдБрдЯреА-рдирдореБрдиреНрдпрд╛рдВрдХрдбреЗ рдЬрд╛рдК, рдХрд╛рд░рдг рд╣рд╛ рд▓реЗрдЦ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрд╛рдВрдРрд╡рдЬреА рднрд╡рд┐рд╖реНрдпрд╛рддреАрд▓ рд╡рд┐рдХрд╕рдХрд╛рдВрджреНрд╡рд╛рд░реЗ рд╡рд╛рдЪрдгреНрдпрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рдЖрд╣реЗ.

2. рджреЗрд╡ рд╡рд╕реНрддреБ

рдЧреЙрдб рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рд╛ рдПрдХ рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрди рдЖрд╣реЗ рдЬреЛ рд╕рд░реНрд╡ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рдлрдВрдХреНрд╢рдиреНрд╕рдЪреНрдпрд╛ рдЕрддреНрдпрдзрд┐рдХ рдПрдХрд╛рдЧреНрд░рддреЗрдЪреЗ рдЖрдгрд┐ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рдЕрд╕рдорд╛рди рдбреЗрдЯрд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЛ (рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд┐рд░рддреЗ рдСрдмреНрдЬреЗрдХреНрдЯ). рдПрдХ рд▓рд╣рд╛рди рдЙрджрд╛рд╣рд░рдг рдШреНрдпрд╛:
public class SomeUserGodObject {
   private static final String FIND_ALL_USERS_EN = "SELECT id, email, phone, first_name_en, access_counter, middle_name_en, last_name_en, created_date FROM users;
   private static final String FIND_BY_ID = "SELECT id, email, phone, first_name_en, access_counter, middle_name_en, last_name_en, created_date FROM users WHERE id = ?";
   private static final String FIND_ALL_CUSTOMERS = "SELECT id, u.email, u.phone, u.first_name_en, u.middle_name_en, u.last_name_en, u.created_date" +
           "  WHERE u.id IN (SELECT up.user_id FROM user_permissions up WHERE up.permission_id = ?)";
   private static final String FIND_BY_EMAIL = "SELECT id, email, phone, first_name_en, access_counter, middle_name_en, last_name_en, created_dateFROM users WHERE email = ?";
   private static final String LIMIT_OFFSET = " LIMIT ? OFFSET ?";
   private static final String ORDER = " ORDER BY ISNULL(last_name_en), last_name_en, ISNULL(first_name_en), first_name_en, ISNULL(last_name_ru), " +
           "last_name_ru, ISNULL(first_name_ru), first_name_ru";
   private static final String CREATE_USER_EN = "INSERT INTO users(id, phone, email, first_name_en, middle_name_en, last_name_en, created_date) " +
           "VALUES (?, ?, ?, ?, ?, ?, ?)";
   private static final String FIND_ID_BY_LANG_CODE = "SELECT id FROM languages WHERE lang_code = ?";
                                  ........
   private final JdbcTemplate jdbcTemplate;
   private Map<String, String> firstName;
   private Map<String, String> middleName;
   private Map<String, String> lastName;
   private List<Long> permission;
                                   ........
   @Override
   public List<User> findAllEnCustomers(Long permissionId) {
       return jdbcTemplate.query( FIND_ALL_CUSTOMERS + ORDER, userRowMapper(), permissionId);
   }
   @Override
   public List<User> findAllEn() {
       return jdbcTemplate.query(FIND_ALL_USERS_EN + ORDER, userRowMapper());
   }
   @Override
   public Optional<List<User>> findAllEnByEmail(String email) {
       var query = FIND_ALL_USERS_EN + FIND_BY_EMAIL + ORDER;
       return Optional.ofNullable(jdbcTemplate.query(query, userRowMapper(), email));
   }
                              .............
   private List<User> findAllWithoutPageEn(Long permissionId, Type type) {
       switch (type) {
           case USERS:
               return findAllEnUsers(permissionId);
           case CUSTOMERS:
               return findAllEnCustomers(permissionId);
           default:
               return findAllEn();
       }
   }
                              ..............тАж

   private RowMapper<User> userRowMapperEn() {
       return (rs, rowNum) ->
               User.builder()
                       .id(rs.getLong("id"))
                       .email(rs.getString("email"))
                       .accessFailed(rs.getInt("access_counter"))
                       .createdDate(rs.getObject("created_date", LocalDateTime.class))
                       .firstName(rs.getString("first_name_en"))
                       .middleName(rs.getString("middle_name_en"))
                       .lastName(rs.getString("last_name_en"))
                       .phone(rs.getString("phone"))
                       .build();
   }
}
рдпреЗрдереЗ рдЖрдкрдг рдПрдХ рдкреНрд░рдЪрдВрдб рд╡рд░реНрдЧ рдкрд╛рд╣рддреЛ рдЬреЛ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдХрд░рддреЛ. рддреНрдпрд╛рдд рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд╡реЗрд░реА рддрд╕реЗрдЪ рдХрд╛рд╣реА рдбреЗрдЯрд╛ рдЖрд╣реЗ. рдЖрдореНрд╣реА findAllWithoutPageEn рджрд░реНрд╢рдиреА рдкрджреНрдзрдд рджреЗрдЦреАрд▓ рдкрд╛рд╣рддреЛ, рдЬреНрдпрд╛рдордзреНрдпреЗ рд╡реНрдпрд╡рд╕рд╛рдп рддрд░реНрдХ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ. рдЕрд╢реА рджреЗрд╡ рд╡рд╕реНрддреВ рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рд░рд╛рдЦрдгреНрдпрд╛рд╕рд╛рдареА рдкреНрд░рдЪрдВрдб рдЖрдгрд┐ рдЕрд╕реНрддрд╛рд╡реНрдпрд╕реНрдд рдмрдирддреЗ. рдХреЛрдбрдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рддреБрдХрдбреНрдпрд╛рдд рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рдЧреЛрдВрдзрд│ рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧреЗрд▓. рд╕рд┐рд╕реНрдЯрдордЪреЗ рдмрд░реЗрдЪ рдШрдЯрдХ рддреНрдпрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рдШрдЯреНрдЯ рдЬреЛрдбрд▓реЗрд▓реЗ рдЕрд╕рддрд╛рдд. рдЕрд╢реА рд╕рдВрд╣рд┐рддрд╛ рд░рд╛рдЦрдгреЗ рдХрдареАрдг рд╣реЛрдд рдЬрд╛рддреЗ. рдЕрд╢рд╛ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ, рдХреЛрдб рд╕реНрд╡рддрдВрддреНрд░ рд╡рд░реНрдЧрд╛рдВрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧрд▓рд╛ рдЧреЗрд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ, рдЬреНрдпрд╛рдкреИрдХреА рдкреНрд░рддреНрдпреЗрдХрд╛рдЪрд╛ рдПрдХрдЪ рдЙрджреНрджреЗрд╢ рдЕрд╕реЗрд▓. рдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдд, рдЖрдкрдг рджреЗрд╡ рдСрдмреНрдЬреЗрдХреНрдЯрд▓рд╛ рдбрд╛рдУ рд╡рд░реНрдЧрд╛рдд рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реВ рд╢рдХрддреЛ:
public class UserDaoImpl {
   private static final String FIND_ALL_USERS_EN = "SELECT id, email, phone, first_name_en, access_counter, middle_name_en, last_name_en, created_date FROM users;
   private static final String FIND_BY_ID = "SELECT id, email, phone, first_name_en, access_counter, middle_name_en, last_name_en, created_date FROM users WHERE id = ?";

                                   ........
   private final JdbcTemplate jdbcTemplate;

                                   ........
   @Override
   public List<User> findAllEnCustomers(Long permissionId) {
       return jdbcTemplate.query(FIND_ALL_CUSTOMERS + ORDER, userRowMapper(), permissionId);
   }
   @Override
   public List<User> findAllEn() {
       return jdbcTemplate.query(FIND_ALL_USERS_EN + ORDER, userRowMapper());
   }

                               ........
}
рдбреЗрдЯрд╛ рдЖрдгрд┐ рдбреЗрдЯрд╛ рдНрдХреНрд╕реЗрд╕ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкрджреНрдзрддреА рдЕрд╕рд▓реЗрд▓рд╛ рд╡рд░реНрдЧ:
public class UserInfo {
   private Map<String, String> firstName;
                     тАж..
   public Map<String, String> getFirstName() {
       return firstName;
   }
   public void setFirstName(Map<String, String> firstName) {
       this.firstName = firstName;
   }
                    ....
рдЖрдгрд┐ рд╡реНрдпрд╡рд╕рд╛рдп рддрд░реНрдХрд╛рд╕рд╣ рдкрджреНрдзрдд рд╕реЗрд╡реЗрдордзреНрдпреЗ рд╣рд▓рд╡рд┐рдгреЗ рдЕрдзрд┐рдХ рдпреЛрдЧреНрдп рдЖрд╣реЗ:
private List<User> findAllWithoutPageEn(Long permissionId, Type type) {
   switch (type) {
       case USERS:
           return findAllEnUsers(permissionId);
       case CUSTOMERS:
           return findAllEnCustomers(permissionId);
       default:
           return findAllEn();
   }
}

3. рд╕рд┐рдВрдЧрд▓рдЯрди

рд╕рд┐рдВрдЧрд▓рдЯрди рд╣рд╛ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛ рдирдореБрдирд╛ рдЖрд╣реЗ. рд╣реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рдХреА рд╕рд┐рдВрдЧрд▓-рдереНрд░реЗрдбреЗрдб рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдордзреНрдпреЗ рдХреНрд▓рд╛рд╕рдЪреЗ рдПрдХрдЪ рдЙрджрд╛рд╣рд░рдг рдЕрд╕реЗрд▓ рдЖрдгрд┐ рддреЗ рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯрд▓рд╛ рдЬрд╛рдЧрддрд┐рдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреВ рдкреНрд░рджрд╛рди рдХрд░рддреЗ. рдкрдг рддреЛ рдкреЕрдЯрд░реНрди рдЖрд╣реЗ рдХреА рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрди? рдЪрд▓рд╛ рдпрд╛ рдкреЕрдЯрд░реНрдирдЪреЗ рддреЛрдЯреЗ рдкрд╛рд╣реВ:
  1. рдЬрд╛рдЧрддрд┐рдХ рд╕реНрдерд┐рддреА рдЬреЗрд╡реНрд╣рд╛ рдЖрдкрдг рд╡рд░реНрдЧрд╛рдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЛ рддреЗрд╡реНрд╣рд╛ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдпрд╛ рд╡рд░реНрдЧрд╛рдЪреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддреА рдорд╛рд╣рд┐рдд рдирд╕рддреЗ. рддреЗ рдХреЛрдгреА рдХрд┐рдВрд╡рд╛ рдХрдзреА рдмрджрд▓рд▓реЗ рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣реАрдд рдирд╛рд╣реА. рдЖрдкрд▓реНрдпрд╛ рдЕрдкреЗрдХреНрд╖реЗрдкреНрд░рдорд╛рдгреЗ рд░рд╛рдЬреНрдп рдХрджрд╛рдЪрд┐рдд рдХрд╛рд╣реА рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА. рджреБрд╕рд▒реНрдпрд╛ рд╢рдмреНрджрд╛рдВрдд, рд╕рд┐рдВрдЧрд▓рдЯрдирд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рдЪреА рд╢реБрджреНрдзрддрд╛ рддреНрдпрд╛рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдХреНрд░рдорд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ. рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдХреА рдЙрдкрдкреНрд░рдгрд╛рд▓реА рдПрдХрдореЗрдХрд╛рдВрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддрд╛рдд рдЖрдгрд┐ рдкрд░рд┐рдгрд╛рдореА, рд░рдЪрдирд╛ рдЧрдВрднреАрд░рдкрдгреЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирддреЗ.

  2. рд╕рд┐рдВрдЧрд▓рдЯрди рд╕реЙрд▓рд┐рдб рддрддреНрддреНрд╡рд╛рдВрдЪреЗ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ тАФ рдПрдХрд▓ рдЬрдмрд╛рдмрджрд╛рд░реАрдЪреЗ рддрддреНрддреНрд╡: рддреНрдпрд╛рдЪреНрдпрд╛ рдереЗрдЯ рдХрд░реНрддрд╡реНрдпрд╛рдВрд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рд╕рд┐рдВрдЧрд▓рдЯрди рд╡рд░реНрдЧ рдШрдЯрдирд╛рдВрдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрд╡рд░ рджреЗрдЦреАрд▓ рдирд┐рдпрдВрддреНрд░рдг рдареЗрд╡рддреЛ.

  3. рдПрдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрдЧрд╛рдЪреЗ рд╕рд┐рдВрдЧрд▓рдЯрдирд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рдгреЗ рд╡рд░реНрдЧрд╛рдЪреНрдпрд╛ рдЗрдВрдЯрд░рдлреЗрд╕рдордзреНрдпреЗ рджрд┐рд╕рдд рдирд╛рд╣реА. рдХрд╛рд░рдг рд╕рд┐рдВрдЧрд▓рдЯрди рдЙрджрд╛рд╣рд░рдг рд╕рд╣рд╕рд╛ рдкрджреНрдзрдд рдпреБрдХреНрддрд┐рд╡рд╛рдж рдореНрд╣рдгреВрди рдкрд╛рд╕ рдХреЗрд▓реЗ рдЬрд╛рдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рддреНрдпрд╛рдРрд╡рдЬреА рдереЗрдЯ getInstance() рджреНрд╡рд╛рд░реЗ рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рд╕рд┐рдВрдЧрд▓рдЯрдирд╡рд░ рд╡рд░реНрдЧрд╛рдЪреЗ рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рдУрд│рдЦрдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдкрджреНрдзрддреАрдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ тАФ рдлрдХреНрдд рд╡рд░реНрдЧрд╛рдЪреНрдпрд╛ рд▓реЛрдХрд╛рдВрдХрдбреЗ рдкрд╛рд╣рдгреЗ рдХрд░рд╛рд░ рдкреБрд░реЗрд╕реЗ рдирд╛рд╣реА.

    рд╕рд┐рдВрдЧрд▓рдЯрдирдЪреА рдЙрдкрд╕реНрдерд┐рддреА рд╕рдВрдкреВрд░реНрдгрдкрдгреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреА рдЪрд╛рдЪрдгреАрдХреНрд╖рдорддрд╛ рдЖрдгрд┐ рд╡рд┐рд╢реЗрд╖рддрдГ рд╕рд┐рдВрдЧрд▓рдЯрди рд╡рд╛рдкрд░рдгрд╛рд░реЗ рд╡рд░реНрдЧ рдХрдореА рдХрд░рддреЗ. рд╕рд░реНрд╡рдкреНрд░рдердо, рддреБрдореНрд╣реА рд╕рд┐рдВрдЧрд▓рдЯрдирд▓рд╛ рдореЙрдХ рдСрдмреНрдЬреЗрдХреНрдЯрд╕рд╣ рдмрджрд▓реВ рд╢рдХрдд рдирд╛рд╣реА. рджреБрд╕рд░реЗ, рд╕рд┐рдВрдЧрд▓рдЯрдирдордзреНрдпреЗ рддреНрдпрд╛рдЪреА рд╕реНрдерд┐рддреА рдмрджрд▓рдгреНрдпрд╛рд╕рд╛рдареА рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрд╕рд▓реНрдпрд╛рд╕, рдЪрд╛рдЪрдгреНрдпрд╛ рдПрдХрдореЗрдХрд╛рдВрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреАрд▓.

    рджреБрд╕-рдпрд╛ рд╢рдмреНрджрд╛рдд рд╕рд╛рдВрдЧрд╛рдпрдЪреЗ рддрд░, рд╕рд┐рдВрдЧрд▓рдЯрди рдХрдкрд▓рд┐рдВрдЧ рд╡рд╛рдврд╡рддреЗ, рдЖрдгрд┐ рд╡рд░ рдирдореВрдж рдХреЗрд▓реЗрд▓реА рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯ рд╡рд╛рдврд▓реЗрд▓реНрдпрд╛ рдХрдкрд▓рд┐рдВрдЧрдЪреНрдпрд╛ рдкрд░рд┐рдгрд╛рдорд╛рдкреЗрдХреНрд╖рд╛ рдХрд╛рд╣реАрдЪ рдирд╛рд╣реА.

    рдЖрдгрд┐ рдЖрдкрдг рдпрд╛рдмрджреНрджрд▓ рд╡рд┐рдЪрд╛рд░ рдХреЗрд▓реНрдпрд╛рд╕, рдЖрдкрдг рд╕рд┐рдВрдЧрд▓рдЯрди рд╡рд╛рдкрд░рдгреЗ рдЯрд╛рд│реВ рд╢рдХрддрд╛. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдПрдЦрд╛рджреНрдпрд╛ рд╡рд╕реНрддреВрдЪреНрдпрд╛ рдШрдЯрдирд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░рдЪреЗ рдХрд╛рд░рдЦрд╛рдиреЗ рд╡рд╛рдкрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ (рдЖрдгрд┐ рдЦрд░реЛрдЦрд░ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ).

    рд╕рд┐рдВрдЧрд▓рдЯрдирд╡рд░ рдЖрдзрд╛рд░рд┐рдд рд╕рдВрдкреВрд░реНрдг рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдпрддреНрдирд╛рдд рд╕рд░реНрд╡рд╛рдд рдореЛрдард╛ рдзреЛрдХрд╛ рдЖрд╣реЗ. рдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рд╕рд╛рдареА рдмрд░реЗрдЪ рдЖрд╢реНрдЪрд░реНрдпрдХрд╛рд░рдХ рдкрд░реНрдпрд╛рдп рдЖрд╣реЗрдд. рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрд╡рд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгрдЬреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ, рдореНрд╣рдгрдЬреЗ рддреНрдпрд╛рдЪреЗ IoC рдХрдВрдЯреЗрдирд░: рддреЗ рд╕реЗрд╡рд╛рдВрдЪреНрдпрд╛ рдирд┐рд░реНрдорд┐рддреАрд╡рд░ рдирд┐рдпрдВрддреНрд░рдг рдареЗрд╡рдгреНрдпрд╛рдЪреНрдпрд╛ рд╕рдорд╕реНрдпреЗрдЪреЗ рдиреИрд╕рд░реНрдЧрд┐рдХ рд╕рдорд╛рдзрд╛рди рдЖрд╣реЗрдд, рдХрд╛рд░рдг рддреЗ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд "рд╕реНрдЯрд┐рд░реЙрдЗрдбреНрд╕рдЪреЗ рдХрд╛рд░рдЦрд╛рдиреЗ" рдЖрд╣реЗрдд.

    рдпрд╛ рд╡рд┐рд╖рдпрд╛рд╡рд░ рдЖрддрд╛ рдЕрдиреЗрдХ рди рд╕рдВрдкрдгрд╛рд░реЗ рдЖрдгрд┐ рди рдЬреБрд│рдгрд╛рд░реЗ рд╡рд╛рджрд╡рд┐рд╡рд╛рдж рд╕реБрд░реВ рдЖрд╣реЗрдд. рд╕рд┐рдВрдЧрд▓рдЯрди рдкреЕрдЯрд░реНрди рдЖрд╣реЗ рдХреА рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрди рдЖрд╣реЗ рд╣реЗ рдард░рд╡рдгреЗ рддреБрдордЪреНрдпрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЖрд╣реЗ.

    рдЖрдореНрд╣реА рддреНрдпрд╛рд╡рд░ рд░реЗрдВрдЧрд╛рд│рдгрд╛рд░ рдирд╛рд╣реА. рддреНрдпрд╛рдРрд╡рдЬреА, рдЖрдореНрд╣реА рдЖрдЬрдЪреНрдпрд╛ рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рдбрд┐рдЭрд╛рдЗрди рдкреЕрдЯрд░реНрдирдХрдбреЗ рдЬрд╛рдК - poltergeist.

4. Poltergeist

рдкреЛрд▓реНрдЯрд░реНрдЬрд┐рд╕реНрдЯ рд╣рд╛ рдПрдХ рдЕрд░реНрдерд╣реАрди рд╡рд░реНрдЧрд╛рдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЕрд╕рд▓реЗрд▓рд╛ рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрди рдЖрд╣реЗ рдЬреЛ рджреБрд╕рд░реНтАНрдпрд╛ рд╡рд░реНрдЧрд╛рдЪреНрдпрд╛ рдкрджреНрдзрддреА рдХреЙрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ рдХрд┐рдВрд╡рд╛ рдлрдХреНрдд рдЕрдореВрд░реНрддрддреЗрдЪрд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕реНрддрд░ рдЬреЛрдбрддреЛ . рд╣реЗ рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрди рд╕реНрд╡рддрдГрд▓рд╛ рдЕрд▓реНрдкрд╛рдпреБрд╖реА рд╡рд╕реНрддреВ рдореНрд╣рдгреВрди рдкреНрд░рдХрдЯ рдХрд░рддреЗ, рдЕрд╡рд╕реНрдереЗрд╢рд┐рд╡рд╛рдп. рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕рдЪрд╛ рд╡рд╛рдкрд░ рдЗрддрд░, рдЕрдзрд┐рдХ рдХрд╛рдпрдорд╕реНрд╡рд░реВрдкреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЗрд▓рд╛ рдЬрд╛рддреЛ.
public class UserManager {
   private UserService service;
   public UserManager(UserService userService) {
       service = userService;
   }
   User createUser(User user) {
       return service.create(user);
   }
   Long findAllUsers(){
       return service.findAll().size();
   }
   String findEmailById(Long id) {
       return service.findById(id).getEmail();}
   User findUserByEmail(String email) {
       return service.findByEmail(email);
   }
   User deleteUserById(Long id) {
       return service.delete(id);
   }
}
рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЕрд╢рд╛ рд╡рд╕реНрддреВрдЪреА рдЧрд░рдЬ рдХрд╛ рдЖрд╣реЗ рдЬреА рдлрдХреНрдд рдордзреНрдпрд╕реНрде рдЖрд╣реЗ рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рдХрд╛рдо рджреБрд╕рд░реНтАНрдпрд╛рд▓рд╛ рд╕реЛрдкрд╡рддреЗ? рдЖрдореНрд╣реА рддреЗ рдХрд╛рдвреВрди рдЯрд╛рдХрддреЛ рдЖрдгрд┐ рджреАрд░реНрдШрдХрд╛рд│ рдЯрд┐рдХрдгрд╛рд▒реНрдпрд╛ рд╡рд╕реНрддреВрдВрдордзреНрдпреЗ рдЕрд╕рд▓реЗрд▓реА рдЫреЛрдЯреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рддреЛ. рдкреБрдвреЗ, рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛рд╕рд╛рдареА (рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд╛рд╕рдХ рдореНрд╣рдгреВрди) рд╕рд░реНрд╡рд╛рдд рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреЕрдЯрд░реНрдирдХрдбреЗ рдЬрд╛рдК, рдореНрд╣рдгрдЬреЗ рд╡рд┐рдХрд╛рд╕ рд╡рд┐рд░реЛрдзреА рдирдореБрдиреЗ .

5. рд╣рд╛рд░реНрдб рдХреЛрдбрд┐рдВрдЧ

рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рдпрд╛ рднрдпрд╛рдирдХ рд╢рдмреНрджрд╛рд╡рд░ рдкреЛрд╣реЛрдЪрд▓реЛ: рд╣рд╛рд░реНрдб рдХреЛрдбрд┐рдВрдЧ. рдпрд╛ рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрдирдЪрд╛ рд╕рд╛рд░ рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рдХреЛрдб рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЖрдгрд┐/рдХрд┐рдВрд╡рд╛ рд╕рд┐рд╕реНрдЯрдо рд╡рд╛рддрд╛рд╡рд░рдгрд╛рд╢реА рдЬреЛрд░рджрд╛рд░рдкрдгреЗ рдЬреЛрдбрд▓реЗрд▓рд╛ рдЖрд╣реЗ. рдЗрддрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╡рд░ рдХреЛрдб рдкреЛрд░реНрдЯ рдХрд░рдгреЗ рд╣реЗ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рдЧреБрдВрддрд╛рдЧреБрдВрддреАрдЪреЗ рдХрд░рддреЗ. рд╣рд╛ рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрди рдореЕрдЬрд┐рдХ рдирдВрдмрд░реНрд╕рд╢реА рдЬрд╡рд│реВрди рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ (рд╣реЗ рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрди рдЕрдиреЗрдХрджрд╛ рдПрдХрдореЗрдХрд╛рдВрд╢реА рдЬреЛрдбрд▓реЗрд▓реЗ рдЕрд╕рддрд╛рдд). рдЙрджрд╛рд╣рд░рдг:
public Connection buildConnection() throws Exception {
   Class.forName("com.mysql.cj.jdbc.Driver");
   connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/someDb?characterEncoding=UTF-8&characterSetResults=UTF-8&serverTimezone=UTC", "user01", "12345qwert");
   return connection;
}
рджреБрдЦрддреЗ, рдирд╛рд╣реА рдХрд╛? рдпреЗрдереЗ рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдХрдиреЗрдХреНрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрдЬ рд╣рд╛рд░реНрдб рдХреЛрдб рдХрд░рддреЛ. рдкрд░рд┐рдгрд╛рдореА, рдХреЛрдб рдлрдХреНрдд MySQL рд╕рд╣ рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдХрд╛рд░реНрдп рдХрд░реЗрд▓. рдбреЗрдЯрд╛рдмреЗрд╕ рдмрджрд▓рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣рд╛рд▓рд╛ рдХреЛрдбрдордзреНрдпреЗ рдЬрд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ рдЖрдгрд┐ рд╕рд░реНрд╡рдХрд╛рд╣реА рд╡реНрдпрдХреНрддрд┐рдЪрд▓рд┐рддрдкрдгреЗ рдмрджрд▓рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡реЗрдЧрд│реНрдпрд╛ рдлрд╛рдИрд▓рдордзреНрдпреЗ рдареЗрд╡рдгреЗ рд╣рд╛ рдПрдХ рдЪрд╛рдВрдЧрд▓рд╛ рдЙрдкрд╛рдп рдЖрд╣реЗ:
spring:
  datasource:
    jdbc-url:jdbc:mysql://localhost:3306/someDb?characterEncoding=UTF-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    username:  user01
    password:  12345qwert
рджреБрд╕рд░рд╛ рдкрд░реНрдпрд╛рдп рдореНрд╣рдгрдЬреЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╡рд╛рдкрд░рдгреЗ.

6. рдмреЛрдЯ рдЕрдБрдХрд░

рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрдирдЪреНрдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд, рдмреЛрдЯ рдЕрдБрдХрд░ рдореНрд╣рдгрдЬреЗ рд╕рд┐рд╕реНрдЯрдордЪреЗ рдХрд╛рд╣реА рднрд╛рдЧ рдареЗрд╡рдгреЗ рдЬреЗ рдХрд╛рд╣реА рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рдХрд┐рдВрд╡рд╛ рд░рд┐рдлреЕрдХреНрдЯрд░рд┐рдВрдЧ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдд рдирд╛рд╣реАрдд. рддрд╕реЗрдЪ, рдХреЛрдбрдЪреЗ рдХрд╛рд╣реА рднрд╛рдЧ рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдЪрд╛рдирдХ рдЧрд░рдЬ рдкрдбрд▓реНрдпрд╛рд╕ "рднрд╡рд┐рд╖реНрдпрд╛рдд рд╡рд╛рдкрд░рд╛рд╕рд╛рдареА" рдареЗрд╡рддрд╛ рдпреЗрддрд╛рдд. рдореВрд▓рдд:, рдпрд╛рдореБрд│реЗ рддреБрдордЪрд╛ рдХреЛрдб рдбрд╕реНрдЯрдмрд┐рдирдордзреНрдпреЗ рдмрджрд▓рддреЛ. рдЙрджрд╛рд╣рд░рдг:
public User update(Long id, User request) {
   User user = mergeUser(findById(id), request);
   return userDAO.update(user);
}
private User mergeUser(User findUser, User requestUser) {
   return new User(
           findUser.getId(),
           requestUser.getEmail() != null ? requestUser.getEmail() : findUser.getEmail(),
           requestUser.getFirstName() != null ? requestUser.getFirstName() : findUser.getFirstNameRu(),
           requestUser.getMiddleName() != null ? requestUser.getMiddleName() : findUser.getMiddleNameRu(),
           requestUser.getLastName() != null ? requestUser.getLastName() : findUser.getLastNameEn(),
           requestUser.getPhone() != null ? requestUser.getPhone() : findUser.getPhone());
}
рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ рдЕрдкрдбреЗрдЯ рдкрджреНрдзрдд рдЖрд╣реЗ рдЬреА рдбреЗрдЯрд╛рдмреЗрд╕рдордзреВрди рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪрд╛ рдбреЗрдЯрд╛ рдореЗрдердбрдордзреНрдпреЗ рдкрд╛рд╕ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдбреЗрдЯрд╛рд╕рд╣ рд╡рд┐рд▓реАрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡реЗрдЧрд│реА рдкрджреНрдзрдд рд╡рд╛рдкрд░рддреЗ (рдЬрд░ рдЕрдкрдбреЗрдЯ рдкрджреНрдзрддреАрдордзреНрдпреЗ рдкрд╛рд╕ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдХрдбреЗ рд╢реВрдиреНрдп рдлреАрд▓реНрдб рдЕрд╕реЗрд▓, рддрд░ рдЬреБрдиреЗ рдлреАрд▓реНрдб рдореВрд▓реНрдп рдбреЗрдЯрд╛рдмреЗрд╕рдордзреВрди рдШреЗрддрд▓реЗ рдЬрд╛рддреЗ) . рдордЧ рд╕рдордЬрд╛ рдирд╡реАрди рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ рдХреА рд░реЗрдХреЙрд░реНрдб рдЬреБрдиреНрдпрд╛рдордзреНрдпреЗ рд╡рд┐рд▓реАрди рдХреЗрд▓реЗ рдЬрд╛рдК рдирдпреЗ, рдкрд░рдВрддреБ рддреНрдпрд╛рдРрд╡рдЬреА, рд╢реВрдиреНрдп рдлреАрд▓реНрдб рдЕрд╕рд▓реЗ рддрд░реАрд╣реА, рддреЗ рдЬреБрдиреЗ рдУрд╡реНрд╣рд░рд░рд╛рдИрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддрд╛рдд:
public User update(Long id, User request) {
   return userDAO.update(user);
}
рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдХреА mergeUser рдпрд╛рдкреБрдвреЗ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реА, рдкрд░рдВрддреБ рддреЛ рд╣рдЯрд╡рдгреЗ рдЦреЗрджрдЬрдирдХ рдЖрд╣реЗ тАФ рд╣реА рдкрджреНрдзрдд (рдХрд┐рдВрд╡рд╛ рдпрд╛ рдкрджреНрдзрддреАрдЪреА рдХрд▓реНрдкрдирд╛) рдПрдЦрд╛рджреНрдпрд╛ рджрд┐рд╡рд╢реА рдЙрдкрдпреЛрдЧреА рдкрдбрд▓реА рддрд░? рдЕрд╕рд╛ рдХреЛрдб рдХреЗрд╡рд│ рдкреНрд░рдгрд╛рд▓реАрдВрдирд╛ рдЧреБрдВрддрд╛рдЧреБрдВрддреАрдЪрд╛ рдмрдирд╡рддреЛ рдЖрдгрд┐ рдЧреЛрдВрдзрд│ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЛ, рдореВрд▓рдд: рдХреЛрдгрддреЗрд╣реА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдореВрд▓реНрдп рдирд╕рддреЗ. рдЖрдкрдг рд╣реЗ рд╡рд┐рд╕рд░реВ рдирдпреЗ рдХреА "рдореГрдд рддреБрдХрдбреНрдпрд╛рдВрд╕рд╣" рдЕрд╕рд╛ рдХреЛрдб рдЬреЗрд╡реНрд╣рд╛ рдЖрдкрдг рджреБрд╕рд░реНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рд╕рд╛рдареА рдирд┐рдШрддрд╛ рддреЗрд╡реНрд╣рд╛ рд╕рд╣рдХрд╛рд▒реНрдпрд╛рд▓рд╛ рдкрд╛рд╕ рдХрд░рдгреЗ рдХрдареАрдг рд╣реЛрдИрд▓. рдмреЛрдЯ рдЕрдБрдХрд░рдЪрд╛ рд╕рд╛рдордирд╛ рдХрд░рдгреНрдпрд╛рдЪрд╛ рд╕рд░реНрд╡реЛрддреНрддрдо рдорд╛рд░реНрдЧ рдореНрд╣рдгрдЬреЗ рдХреЛрдб рд░рд┐рдлреЕрдХреНрдЯрд░ рдХрд░рдгреЗ, рдореНрд╣рдгрдЬреЗ рдХреЛрдбрдЪреЗ рд╡рд┐рднрд╛рдЧ рд╣рдЯрд╡рдгреЗ (рд╣реГрджрдпрджреНрд░рд╛рд╡рдХ, рдорд▓рд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ). рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рд╡рд┐рдХрд╛рд╕рд╛рдЪреЗ рд╡реЗрд│рд╛рдкрддреНрд░рдХ рддрдпрд╛рд░ рдХрд░рддрд╛рдирд╛, рдЕрд╢рд╛ рдЕрдБрдХрд░рдЪрд╛ рд╣рд┐рд╢реЗрдм рдареЗрд╡рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ (рдиреАрдЯрдиреЗрдЯрдХреЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡реЗрд│ рд╡рд╛рдЯрдк рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА).

7. рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗрд╕рдкреВрд▓

рдпрд╛ рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрдирдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдкреНрд░рдердо рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд▓ рдкреЕрдЯрд░реНрдирд╢реА рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ . рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд▓ (рд╕рдВрд╕рд╛рдзрди рдкреВрд▓) рд╣рд╛ рдПрдХ рд╕реГрдЬрдирд╛рддреНрдордХ рдбрд┐рдЭрд╛рдЗрди рдкреЕрдЯрд░реНрди рдЖрд╣реЗ , рдЬреЛ рдЖрд░рдВрдн рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЖрдгрд┐ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рддрдпрд╛рд░ рд╡рд╕реНрддреВрдВрдЪрд╛ рд╕рдВрдЪ рдЖрд╣реЗ. рдЬреЗрд╡реНрд╣рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рд▓рд╛ рдПрдЦрд╛рджреНрдпрд╛ рд╡рд╕реНрддреВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рддреЗ рддреЗрд╡реНрд╣рд╛ рддреА рдкреБрдиреНрд╣рд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдРрд╡рдЬреА рдпрд╛ рдкреВрд▓рдордзреВрди рдШреЗрддрд▓реА рдЬрд╛рддреЗ. рдЬреЗрд╡реНрд╣рд╛ рдПрдЦрд╛рджреА рд╡рд╕реНрддреВ рдпрд╛рдкреБрдвреЗ рдЖрд╡рд╢реНрдпрдХ рдирд╕рддреЗ рддреЗрд╡реНрд╣рд╛ рддреА рдирд╖реНрдЯ рд╣реЛрдд рдирд╛рд╣реА. рддреНрдпрд╛рдРрд╡рдЬреА, рддреЗ рдкреВрд▓рдордзреНрдпреЗ рдкрд░рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ. рд╣рд╛ рдкреЕрдЯрд░реНрди рд╕рд╛рдорд╛рдиреНрдпрдд: рдЬрдб рд╡рд╕реНрддреВрдВрд╕рд╛рдареА рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ рдЬреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡реЗрд│ рдШреЗрдгрд╛рд░реЗ рдЕрд╕рддрд╛рдд, рдЬрд╕реЗ рдХреА рдбреЗрдЯрд╛рдмреЗрд╕рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рддрд╛рдирд╛. рдПрдХ рд▓рд╣рд╛рди рдЖрдгрд┐ рд╕рд╛рдзреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╛рд╣реВ. рдпреЗрдереЗ рдПрдХ рд╡рд░реНрдЧ рдЖрд╣реЗ рдЬреЛ рдпрд╛ рдкреЕрдЯрд░реНрдирдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЛ:
class ReusablePool {
   private static ReusablePool pool;
   private List<Resource> list = new LinkedList<>();
   private ReusablePool() {
       for (int i = 0; i < 3; i++)
           list.add(new Resource());
   }
   public static ReusablePool getInstance() {
       if (pool == null) {
           pool = new ReusablePool();
       }
       return pool;
   }
   public Resource acquireResource() {
       if (list.size() == 0) {
           return new Resource();
       } else {
           Resource r = list.get(0);
           list.remove(r);
           return r;
       }
   }
   public void releaseResource(Resource r) {
       list.add(r);
   }
}
рд╣рд╛ рд╡рд░реНрдЧ рд╡рд░реАрд▓ рд╕рд┐рдВрдЧрд▓рдЯрди рдкреЕрдЯрд░реНрди/рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрдирдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рд╕рд╛рджрд░ рдХреЗрд▓рд╛ рдЖрд╣реЗ , рдореНрд╣рдгрдЬреЗ рдпрд╛ рдкреНрд░рдХрд╛рд░рд╛рддреАрд▓ рдПрдХрдЪ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрд╕реВ рд╢рдХрддреЛ. рд╣реЗ рдХрд╛рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╕реНрддреВ рд╡рд╛рдкрд░рддреЗ Resource. рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░, рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ 4 рдЙрджрд╛рд╣рд░рдгрд╛рдВрд╕рд╣ рдкреВрд▓ рднрд░рддреЛ. рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдЦрд╛рджреА рд╡рд╕реНрддреВ рдорд┐рд│рддреЗ, рддреЗрд╡реНрд╣рд╛ рддреА рдкреВрд▓рдордзреВрди рдХрд╛рдврд▓реА рдЬрд╛рддреЗ (рдЬрд░ рддреЗрдереЗ рдХреЛрдгрддреАрд╣реА рд╡рд╕реНрддреВ рдЙрдкрд▓рдмреНрдз рдирд╕реЗрд▓, рддрд░ рддреА рддрдпрд╛рд░ рдХреЗрд▓реА рдЬрд╛рддреЗ рдЖрдгрд┐ рд▓рдЧреЗрдЪ рдкрд░рдд рдХреЗрд▓реА рдЬрд╛рддреЗ). рдЖрдгрд┐ рд╢реЗрд╡рдЯреА, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░рдд рдареЗрд╡рдгреНрдпрд╛рдЪреА рдкрджреНрдзрдд рдЖрд╣реЗ. рд╕рдВрд╕рд╛рдзрди рд╡рд╕реНрддреВ рдпрд╛рд╕рд╛рд░рдЦреЗ рджрд┐рд╕рддрд╛рдд:
public class Resource {
   private Map<String, String> patterns;
   public Resource() {
       patterns = new HashMap<>();
       patterns.put("proxy", "https://en.wikipedia.org/wiki/Proxy_pattern");
       patterns.put("bridge", "https://en.wikipedia.org/wiki/Bridge_pattern");
       patterns.put("facade", "https://en.wikipedia.org/wiki/Facade_pattern");
       patterns.put("builder", "https://en.wikipedia.org/wiki/Builder_pattern");
   }
   public Map<String, String> getPatterns() {
       return patterns;
   }
   public void setPatterns(Map<String, String> patterns) {
       this.patterns = patterns;
   }
}
рдпреЗрдереЗ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ рд▓рд╣рд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдХреА рдореНрд╣рдгреВрди рдбрд┐рдЭрд╛рдЗрди рдкреЕрдЯрд░реНрдирдЪреА рдирд╛рд╡реЗ рдЖрд╣реЗрдд рдЖрдгрд┐ рдореВрд▓реНрдп рдореНрд╣рдгреВрди рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд▓рд┐рдВрдХреНрд╕ рдЖрд╣реЗрдд, рддрд╕реЗрдЪ рдирдХрд╛рд╢рд╛рд╡рд░ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкрджреНрдзрддреА рдЖрд╣реЗрдд. рдЪрд▓рд╛ рдореБрдЦреНрдп рдЧреЛрд╖реНрдЯреАрдВрд╡рд░ рдПрдХ рдирдЬрд░ рдЯрд╛рдХреВрдпрд╛:
class SomeMain {
   public static void main(String[] args) {
       ReusablePool pool = ReusablePool.getInstance();

       Resource firstResource = pool.acquireResource();
       Map<String, String> firstPatterns = firstResource.getPatterns();
       // use our map somehow...
       pool.releaseResource(firstResource);

       Resource secondResource = pool.acquireResource();
       Map<String, String> secondPatterns = firstResource.getPatterns();
       // use our map somehow...
       pool.releaseResource(secondResource);

       Resource thirdResource = pool.acquireResource();
       Map<String, String> thirdPatterns = firstResource.getPatterns();
       // use our map somehow...
       pool.releaseResource(thirdResource);
   }
}
рдпреЗрдереЗ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдкреБрд░реЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдЖрд╣реЗ: рдЖрдореНрд╣рд╛рд▓рд╛ рдкреВрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд│рддреЛ, рдкреВрд▓рдордзреВрди рд╕рдВрд╕рд╛рдзрдирд╛рдВрд╕рд╣ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд│рд╡рддреЛ, рд╕рдВрд╕рд╛рдзрди рдСрдмреНрдЬреЗрдХреНрдЯрдХрдбреВрди рдирдХрд╛рд╢рд╛ рдорд┐рд│рд╡рддреЛ, рддреНрдпрд╛рдЪреНрдпрд╛рд╕рд╣ рдХрд╛рд╣реАрддрд░реА рдХрд░рддреЛ рдЖрдгрд┐ рдкреБрдвреАрд▓ рдкреБрдирд░реНрд╡рд╛рдкрд░рд╛рд╕рд╛рдареА рд╣реЗ рд╕рд░реНрд╡ рддреНрдпрд╛рдЪреНрдпрд╛ рдЬрд╛рдЧреА рдареЗрд╡рддреЛ. рд╡реНрд╣реЙрдЗрд▓рд╛, рд╣рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд▓ рдбрд┐рдЭрд╛рдЗрди рдирдореБрдирд╛ рдЖрд╣реЗ. рдкрдг рдЖрдореНрд╣реА рд╡рд┐рд░реЛрдзреА рдирдореБрдиреНрдпрд╛рдВрдмрджреНрджрд▓ рдмреЛрд▓рдд рд╣реЛрддреЛ, рдмрд░реЛрдмрд░? рдореБрдЦреНрдп рдкрджреНрдзрддреАрдордзреНрдпреЗ рдЦрд╛рд▓реАрд▓ рдкреНрд░рдХрд░рдгрд╛рдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдпрд╛:
Resource fourthResource = pool.acquireResource();
   Map<String, String> fourthPatterns = firstResource.getPatterns();
// use our map somehow...
fourthPatterns.clear();
firstPatterns.put("first","blablabla");
firstPatterns.put("second","blablabla");
firstPatterns.put("third","blablabla");
firstPatterns.put("fourth","blablabla");
pool.releaseResource(fourthResource);
рдпреЗрдереЗ, рдкреБрдиреНрд╣рд╛, рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд│рддреЛ, рдЖрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдЪрд╛ рдирдореБрдирд╛ рдирдХрд╛рд╢рд╛ рдорд┐рд│рддреЛ рдЖрдгрд┐ рдЖрдореНрд╣реА рдирдХрд╛рд╢рд╛рд╕рд╣ рдХрд╛рд╣реАрддрд░реА рдХрд░рддреЛ. рдкрд░рдВрддреБ рдирдХрд╛рд╢рд╛ рдкреБрдиреНрд╣рд╛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕рдЪреНрдпрд╛ рдкреВрд▓рдордзреНрдпреЗ рд╕реЗрд╡реНрд╣ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА, рддреЛ рд╕рд╛рдл рдХреЗрд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ рдирдВрддрд░ рджреВрд╖рд┐рдд рдбреЗрдЯрд╛рдиреЗ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ, рдЬреНрдпрд╛рдореБрд│реЗ рд░рд┐рд╕реЛрд░реНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреБрдирд░реНрд╡рд╛рдкрд░рд╛рд╕рд╛рдареА рдЕрдпреЛрдЧреНрдп рдмрдирддреЛ. рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд▓рдЪреНрдпрд╛ рдореБрдЦреНрдп рддрдкрд╢реАрд▓рд╛рдВрдкреИрдХреА рдПрдХ рдореНрд╣рдгрдЬреЗ рдЬреЗрд╡реНрд╣рд╛ рдПрдЦрд╛рджреА рд╡рд╕реНрддреВ рдкрд░рдд рдХреЗрд▓реА рдЬрд╛рддреЗ, рддреЗрд╡реНрд╣рд╛ рддреА рдкреБрдвреАрд▓ рдкреБрдирд░реНрд╡рд╛рдкрд░рд╛рд╕рд╛рдареА рдпреЛрдЧреНрдп рд╕реНрдерд┐рддреАрдд рдкреБрдирд░реНрд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЬрд░ рдкреВрд▓рдордзреНрдпреЗ рдкрд░рдд рдЖрд▓реЗрд▓реНрдпрд╛ рд╡рд╕реНрддреВ рдЪреБрдХреАрдЪреНрдпрд╛ рдХрд┐рдВрд╡рд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реНрдерд┐рддреАрдд рд░рд╛рд╣рд┐рд▓реНрдпрд╛ рддрд░ рдЖрдордЪреНрдпрд╛ рдбрд┐рдЭрд╛рдЗрдирд▓рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗрд╕рдкреВрд▓ рдореНрд╣рдгрддрд╛рдд. рдкреБрдирд░реНрд╡рд╛рдкрд░рд╛рд╕рд╛рдареА рдпреЛрдЧреНрдп рдирд╕рд▓реЗрд▓реНрдпрд╛ рд╡рд╕реНрддреВ рд╕рд╛рдард╡рдгреНрдпрд╛рдд рдХрд╛рд╣реА рдЕрд░реНрде рдЖрд╣реЗ рдХрд╛? рдпрд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдд, рдЖрдореНрд╣реА рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░рдордзреНрдпреЗ рдЕрдВрддрд░реНрдЧрдд рдирдХрд╛рд╢рд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдирд╡реВ рд╢рдХрддреЛ:
public Resource() {
   patterns = new HashMap<>();
   patterns.put("proxy", "https://en.wikipedia.org/wiki/Proxy_pattern");
   patterns.put("bridge", "https://en.wikipedia.org/wiki/Bridge_pattern");
   patterns.put("facade", "https://en.wikipedia.org/wiki/Facade_pattern");
   patterns.put("builder", "https://en.wikipedia.org/wiki/Builder_pattern");
   patterns = Collections.unmodifiableMap(patterns);
}
рдирдХрд╛рд╢реЗрдЪреА рд╕рд╛рдордЧреНрд░реА рдмрджрд▓рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдЖрдгрд┐ рдЗрдЪреНрдЫрд╛ рддреЗ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреАрд▓ UnsupportedOperationException рдореБрд│реЗ рдирд╛рд╣реАрд╕реЗ рд╣реЛрддреАрд▓. рдЕрдБрдЯреА-рдкреЕрдЯрд░реНрди рд╣реЗ рд╕рд╛рдкрд│реЗ рдЖрд╣реЗрдд рдЬреЗ рд╡рд┐рдХрд╛рд╕рдХрд╛рдВрдирд╛ рд╡реЗрд│реЗрдЪреА рддреАрд╡реНрд░ рдХрдорддрд░рддрд╛, рдирд┐рд╖реНрдХрд╛рд│рдЬреАрдкрдгрд╛, рдЕрдирдиреБрднрд╡реАрдкрдгрд╛ рдХрд┐рдВрд╡рд╛ рдкреНрд░рдХрд▓реНрдк рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрд╛рдВрдЪреНрдпрд╛ рджрдмрд╛рд╡рд╛рдореБрд│реЗ рд╡рд╛рд░рдВрд╡рд╛рд░ рд╕рд╛рдореЛрд░реЗ рдЬрд╛рд╡реЗ рд▓рд╛рдЧрддреЗ. рдШрд╛рдИ рдХрд░рдгреЗ, рдЬреЗ рд╕рд╛рдорд╛рдиреНрдп рдЖрд╣реЗ, рднрд╡рд┐рд╖реНрдпрд╛рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рд╕рд╛рдареА рдореЛрдареНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реВ рд╢рдХрддрд╛рдд, рдореНрд╣рдгреВрди рддреБрдореНрд╣рд╛рд▓рд╛ рдпрд╛ рддреНрд░реБрдЯреАрдВрдмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рдЕрд╕рдгреЗ рдЖрдгрд┐ рддреНрдпрд╛ рдЖрдзреАрдЪ рдЯрд╛рд│рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдпрд╛рдореБрд│реЗ рд▓реЗрдЦрд╛рдЪрд╛ рдкрд╣рд┐рд▓рд╛ рднрд╛рдЧ рд╕рдВрдкрддреЛ. рдкреБрдвреЗ рдЪрд╛рд▓реВ...
рдЯрд┐рдкреНрдкрдгреНрдпрд╛
  • рд▓реЛрдХрдкреНрд░рд┐рдп
  • рдирд╡реАрди
  • рдЬреБрдиреЗ
рдЯрд┐рдкреНрдкрдгреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣реА рд╕рд╛рдИрди рдЗрди рдХреЗрд▓реЗрд▓реЗ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ
рдпрд╛ рдкрд╛рдирд╛рд╡рд░ рдЕрдЬреВрди рдХреЛрдгрддреНрдпрд╛рд╣реА рдЯрд┐рдкреНрдкрдгреНрдпрд╛ рдирд╛рд╣реАрдд