
рд╣рдо Grubhub рдореЗрдВ рд▓рдЧрднрдЧ рдкреВрд░реЗ рдмреИрдХрдПрдВрдб рдореЗрдВ Java рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕рд┐рджреНрдз рднрд╛рд╖рд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдкрд┐рдЫрд▓реЗ 20 рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдЕрдкрдиреА рдЧрддрд┐ рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рд╕рд╛рдмрд┐рдд рдХреА рд╣реИред рд▓реЗрдХрд┐рди рдЗрди рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, "рдмреВрдврд╝реЗ рдЖрджрдореА" рдХреА рдЙрдореНрд░ рдЕрднреА рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдиреЗ рд▓рдЧреА рдереАред
рдЬрд╛рд╡рд╛
рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЬреЗрд╡реАрдПрдо рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ , рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдирд╣реАрдВред рд╣рд╛рд▓ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, рд╡рд╣ рд╕реНрдХрд╛рд▓рд╛, рдХреНрд▓реЛрдЬрд░ рдФрд░ рдХреЛрдЯрд▓рд┐рди рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╡реЗ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдЬреЗрд╡реАрдПрдо рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдпреЗ рдирд╡рд╛рдЪрд╛рд░ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВред рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХреЗ рдХрд╛рд░рдг, рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдмрдиреЗ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд╛рд╡рд╛ 8 (рд╡рд▓реНрд▓рд╛рд╣, рд╕реНрдерд╛рдиреАрдп-рд╡реИрд░рд┐рдПрдмрд▓ рдЯрд╛рдЗрдк рдЗрдВрдЯреНрд░реЗрдВрд╕, рд▓реВрдо) рдореЗрдВ рдЫрд╣ рдорд╣реАрдиреЗ рдХреА рд░рд┐рд▓реАрдЬрд╝ рд╢реЗрдбреНрдпреВрд▓ рдФрд░ рдХрдИ JEP (JDK рдПрдиреНрд╣рд╛рдВрд╕рдореЗрдВрдЯ рдкреНрд░рд╕реНрддрд╛рд╡) рдЗрд╕ рдмрд╛рдд рдХрд╛ рдкреНрд░рдорд╛рдг рд╣реИрдВ рдХрд┐ рдЬрд╛рд╡рд╛ рд╕рд╛рд▓реЛрдВ рддрдХ рдПрдХ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рднрд╛рд╖рд╛ рдмрдиреА рд░рд╣реЗрдЧреАред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрд╛рд╡рд╛ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рдкреИрдорд╛рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣рдо рдзреАрд░реЗ-рдзреАрд░реЗ рдкреНрд░рдЧрддрд┐ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рди рдХрд┐ рд╣рд░ рдХреАрдордд рдкрд░ рдкрд┐рдЫрдбрд╝реА рдЕрдиреБрдХреВрд▓рддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдкреНрд░рдмрд▓ рдЗрдЪреНрдЫрд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд╛рд╕ рдореЗрдВ, рдкрд╣рд▓реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЕрдЧрд░ рдмрд┐рд▓реНрдХреБрд▓ рднреА, рднрд╛рд╖рд╛ рдореЗрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо Grubhub рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓реЛрдордмреЛрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЕрднреА рд╣рдорд╛рд░реЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рдЬрд╛рд╡рд╛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдФрд░ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд▓реЛрдореНрдмреЛрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рд╕рдВрдХрд▓рдХ рдкреНрд▓рдЧрдЗрди рд╣реИ рдЬреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ рдирдП "рдХреАрд╡рд░реНрдб" рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рд╡рд┐рдХрд╛рд╕ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд▓реЛрдореНрдмреЛрдХ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
рдЧреНрд░реБрдм рд╣рдореЗрд╢рд╛ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЬреАрд╡рди рдЪрдХреНрд░ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд░ рдирдП рдЙрдкрдХрд░рдг рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рд╣реЛрддреА рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд▓реЛрдореНрдмреЛрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдПрдХ рдЬреЛрдбрд╝реА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЧреНрд░реЗрдбрд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
рд▓реЛрдореНрдмреЛрдХ рдиреЗ рд╕рдВрдХрд▓рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рд╡рд╛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдЬрд╛рд╡рд╛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ:
lombok
рдирд┐рд░реНрднрд░рддрд╛ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рдЖрдХрд╛рд░ рдирд╣реАрдВ рдмрдврд╝реЗрдЧрд╛ред
рд▓реЛрдореНрдмреЛрдХ рдХреЛ
рдЧреНрд░реИрдбрд▓ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдпрд╣ рдорд╛рд╡реЗрди рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ), рдмрд╕
рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ
рдмрд┐рд▓реНрдб.рдЧреНрд░реЗрдб рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
plugins { id 'io.franzbecker.gradle-lombok' version '1.14' id 'java' } repositories { jcenter()
рд▓реЛрдореНрдмреЛрдХ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░рд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╡реИрдз рдЬрд╛рд╡рд╛ рдХреЛрдб
рдирд╣реАрдВ рд╣реЛрдЧрд╛ ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрдИрдбреАрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЕрдиреНрдпрдерд╛ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдорд╛рд╣реМрд▓ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред рд▓рдВрдмреЛрдХ рд╕рднреА рдкреНрд░рдореБрдЦ рдЬрд╛рд╡рд╛ рдЖрдИрдбреАрдИ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╕рд╣рдЬ рдПрдХреАрдХрд░рдгред "рд╢реЛ рдЙрдкрдпреЛрдЧ" рдФрд░ "рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЬрд╛рдПрдВ" рдЬреИрд╕реЗ рд╕рднреА рдХрд╛рд░реНрдп рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП, рдЖрдкрдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб / рд╡рд░реНрдЧ рдореЗрдВ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред
рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рд▓реЛрдореНрдмреЛрдХ
рд▓реЛрдореНрдмреЛрдХ рдХреЛ рдЬрд╛рдирдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХреНрд╢рди рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рдПред рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
POJO рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд░рд┐рд▓реЗ рдХрд░реЗрдВ
"рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рдЬрд╛рд╡рд╛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕" (рдкреАрдУрдЬреЗрдУ) рдХреЗ рд╕рд╛рде, рд╣рдо рдиреЗрдЯрд╡рд░реНрдХ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╕рд╛рдзрд╛рд░рдг POJO рдореЗрдВ рдХрдИ рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рдВрдЧрдд рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рднреА рд╣реИрдВред рд╡реЗ рдиреМрдХрд░реА рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд▓реЛрдореНрдмреЛрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреЗ рдмрд┐рдирд╛ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдФрд░ рд╕рдВрд░рдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдкреАрдУрдЬреЗрдУ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдЗрд╕
@Data
рд╣рдо
@Data
рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд POJO рдХреЛ рд╕рд░рд▓
@Data
рд╣реИрдВ:
@Data public class User { private UUID userId; private String email; }
@Data
рд╕рд┐рд░реНрдл рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдПрдиреЛрдЯреЗрд╢рди рд╣реИ рдЬреЛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдХрдИ
@Data
рдПрдиреЛрдЯреЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
@ToString
toString()
рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ рд╕рд╛рдл рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реЛрддрд╛ рд╣реИ: рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо, рд╕рднреА рдлрд╝реАрд▓реНрдб рдФрд░ рдЙрдирдХреЗ рдорд╛рдиред
@EqualsAndHashCode
equals
рдФрд░ @EqualsAndHashCode
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЧреИрд░-рд╕реНрдерд┐рд░ рдФрд░ рдЧреИрд░-рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рд╣реИред
@Getter / @Setter
рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП @Getter / @Setter
рдФрд░ @Getter / @Setter
рдмрдирд╛рддрд╛ рд╣реИред
@RequiredArgsConstructor
рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЕрдВрддрд┐рдо рдлрд╝реАрд▓реНрдб рдФрд░ @NonNull
рдПрдиреЛрдЯреЗрд╢рди рд╡рд╛рд▓реЗ рдлрд╝реАрд▓реНрдб @NonNull
(рдиреАрдЪреЗ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ)ред
рдпрд╣ рдПрдиреЛрдЯреЗрд╢рди рдЕрдХреЗрд▓реЗ рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдврдВрдЧ рд╕реЗ рдХрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди POJO рд╣рдореЗрд╢рд╛ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
@Data
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд░реНрдЧ рд╣реИ, рдЬрд┐рд╕рдХреЗ рджреБрд░реБрдкрдпреЛрдЧ рд╕реЗ рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╝ рд╕рдХрддреА рд╣реИ рдФрд░
@Data
рд╕реАрдорд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬреЛ рдЖрд╡реЗрджрди рдХреА рдЙрддреНрддрд░рдЬреАрд╡рд┐рддрд╛ рдХреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИред
рдПрдХ рдФрд░ рдЙрдкрд╛рдп рд╣реИред рдЪрд▓реЛ рд╣рдорд╛рд░реЗ
User
рд╡рд░реНрдЧ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
@Value @Builder(toBuilder = true) public class User { @NonNull UUID userId; @NonNull String email; @Singular Set<String> favoriteFoods; @NonNull @Builder.Default String avatar = тАЬdefault.pngтАЭ; }
@Value
рдПрдиреЛрдЯреЗрд╢рди
@Value
рд╕рдорд╛рди рд╣реИ рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╕рднреА рдлрд╝реАрд▓реНрдб рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рдЬреА рдФрд░ рдЕрдВрддрд┐рдо рд╣реИрдВ, рдФрд░ рдмрд╕рдиреЗ рд╡рд╛рд▓реЗ рдирд╣реАрдВ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж,
@Value
рдСрдмреНрдЬреЗрдХреНрдЯ рддреБрд░рдВрдд рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╕рднреА рдХреНрд╖реЗрддреНрд░ рдЕрдВрддрд┐рдо рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рддрд░реНрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп,
@AllArgsConstructor
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдПрдХ рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ, рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд╕реНрддреБ рд╣реИред
рд▓реЗрдХрд┐рди рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдСрд▓-рдЖрд░реНрдЧ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЬреЛрд╢реБрдЖ рдмрд▓реЛрдЪ рдиреЗ рдЕрдкрдиреА рдкреБрд╕реНрддрдХ рдЗрдлреЗрдХреНрдЯрд┐рд╡ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдмрддрд╛рдпрд╛ рд╣реИ, рдЕрдЧрд░ рдЖрдкрдХреЛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдбрд┐рдЬрд╛рдЗрдирд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдмрд┐рд▓реНрдбрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдБ рдкрд░
@Builder
рд╡рд░реНрдЧ
@Builder
рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:
User user = User.builder() .userId(UUID.random()) .email(тАЬgrubhub@grubhub.comтАЭ) .favoriteFood(тАЬburritosтАЭ) .favoriteFood(тАЬdosasтАЭ) .build()
рдПрдХ рдмрд┐рд▓реНрдбрд░ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдирд╛ рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдмрд┐рд▓реНрдбрд░ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╡рд╕реНрддреБ рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ
build()
рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИред
@NonNull
рдЙрдкрдпреЛрдЧ рдпрд╣
@NonNull
рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡реГрддреНрддрд┐ рдмрдирд╛рддреЗ рд╕рдордп рдпреЗ рдлрд╝реАрд▓реНрдб рд░рд┐рдХреНрдд рдирд╣реАрдВ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛,
NullPointerException
рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрд╡рддрд╛рд░ рдлрд╝реАрд▓реНрдб рдХреЛ
@NonNull
рд╕рд╛рде рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛
@NonNull
рд▓реЗрдХрд┐рди рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐
@Builder.Default
рдПрдиреЛрдЯреЗрд╢рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ
default.png рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдмрд┐рд▓реНрдбрд░ рдкрд╕рдВрджреАрджрд╛рдлреВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ, рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдоред рдЬрдм рдХрд▓реЗрдХреНрд╢рди рдкреНрд░реЙрдкрд░реНрдЯреА рдкрд░
@Singular
рдПрдиреЛрдЯреЗрд╢рди рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ
@Singular
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдмрд┐рд▓реНрдбрд░ рддрд░реАрдХреЗ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкреВрд░реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдпрд╣ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЫреЛрдЯреЗ рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рд░рд▓ рдФрд░ рддреЗрдЬ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ,
toBuilder = true
рдкреИрд░рд╛рдореАрдЯрд░
toBuilder()
рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рднреА рдорд╛рдиреЛрдВ рд╕реЗ рднрд░рд╛ рдПрдХ рдмрд┐рд▓реНрдбрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдореВрд▓ рд╕реЗ рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░реНрд╡-рдЖрдмрд╛рджреА, рддрд╛рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд░рд╣реЗред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ
@Value
рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝реАрд▓реНрдб рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВред
рдХреБрдЫ рдиреЛрдЯ рдЖрдЧреЗ рд╕реЗрдЯрд░ рдХреЗ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
@Wither
рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рд▓рд┐рдП
@Wither
рддрд░реАрдХреЗ рдмрдирд╛рддрд╛ рд╣реИред рдЗрдирдкреБрдЯ рдкрд░, рдореВрд▓реНрдп; рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЕрджреНрдпрддрди рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдХреНрд▓реЛрдиред
@Accessors
рдЖрдкрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд
@Accessors
рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
fluent=true
рдкреИрд░рд╛рдореАрдЯрд░ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдФрд░ рд╕реЗрдЯ рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИред рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдпрд╣
@Builder
рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧреА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рд▓реЛрдореНрдмреЛрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдкрдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ (рдФрд░ рдЖрдкрдиреЗ рдПрдиреЛрдЯреЗрд╢рди рд╕рдВрд╢реЛрдзрдХ рдХреЛ рджреЗрдЦрд╛ рд╣реИ), рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕
@Data
рд╡рд░реНрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ
@Data
рдХреЛ рдХрд╕реНрдЯрдо рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдмрд╕ рдЗрд╕
@Data
рд▓рд╛рдЧреВ рдХрд░реЗрдВред рд▓реЛрдореНрдмреЛрдХ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЧрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдмрд╕ рдХреБрдЫ рд╕рд░рд▓ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде, рдЖрдзрд╛рд░ POJO рдХреЛ рдЗрддрдиреА рд╕рдореГрджреНрдз рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИ рд╣реИрдВ рдЬреЛ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд┐рдП рдмрд┐рдирд╛ рдпрд╛ рд╡рд┐рдХрд╛рд╕ рд▓рд╛рдЧрддреЛрдВ рдХреЛ рдмрдврд╝рд╛рдП рдмрд┐рдирд╛, рд╣рдорд╛рд░реЗ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЗ рдХрд╛рдо рдХреЛ рд▓реЛрдб рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреА рд╣реИрдВред
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛрдб рд╣рдЯрд╛рдирд╛
рд▓реЛрдореНрдмреЛрдХ рди рдХреЗрд╡рд▓ рдкреАрдУрдЬреЗрдУ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ: рдЗрд╕реЗ рдЖрд╡реЗрджрди рдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрддрд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЛрдореНрдмреЛрдХ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдпреЛрдЧ рдШрдЯрдХ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХ, рд╕реЗрд╡рд╛рдПрдВ рдФрд░ рдбреАрдПрдУ (рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ)ред
рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рднреА рднрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреЛрдИ рднреА рд╡рд░реНрдЧ рдЬреЛ рд╕рд╛рд░реНрдердХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ рдПрдХ рд▓реЙрдЧ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдорд╛рдирдХ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрди рдЬрд╛рддрд╛ рд╣реИред рд▓реЛрдореНрдмреЛрдХ рдЗрд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рдПрдХрд▓ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣реА рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред рдЬрд░реНрдирд▓ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдиреЛрдЯреЗрд╢рди рд╣реИрдВред
@Slf4j
рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реА рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВ:
@Slf4j @RequiredArgsConstructor @FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE) public class UserService { @NonNull UserDao userDao; }
@FieldDefaults
рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЕрдВрддрд┐рдо рдФрд░ рдирд┐рдЬреА рд╕рдВрд╢реЛрдзрдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
@RequiredArgsConstructor
рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ
@RequiredArgsConstructor
рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
@NonNull
, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░
NullPointerException
UserDao
рдпрджрд┐
UserDao
рдЖрд╡реГрддреНрддрд┐ рд╢реВрдиреНрдп рд╣реИред
рд▓реЗрдХрд┐рди рд░реБрдХреЛ, рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИ!
рдХрдИ рдФрд░ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рд▓реЛрдореНрдмреЛрдХ рдЕрдкрдирд╛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рдЦрдВрдбреЛрдВ рдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдП, рд▓реЗрдХрд┐рди рд▓реЛрдореНрдмреЛрдХ рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдХреБрдЫ рдЫреЛрдЯреЗ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╣рд╛рд▓рд╛рдВрдХрд┐
var
рдХреАрд╡рд░реНрдб рдЬрд╛рд╡рд╛ 9 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдлрд┐рд░ рднреА рдЪрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЛрдореНрдмреЛрдХ рдореЗрдВ рдХреАрд╡рд░реНрдб
val
, рдЬреЛ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рдЕрдВрддрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╕реНрдереИрддрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИред рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЛ рд░реЛрдХрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдПрдХ рдирд┐рдЬреА рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИред
@UtilityClass
рдиреЗ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ
@UtilityClass
рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ рд╕рдВрд╣рд┐рддрд╛рдмрджреНрдз рдХрд┐рдпрд╛ред рдпрд╣ рдПрдХ рдирд┐рдЬреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЕрдВрдд рдореЗрдВ рдХреНрд▓рд╛рд╕ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдмрдирд╛рддрд╛ рд╣реИред
@UtilityClass
рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдХрд╛рд░рдг рдореМрдЦрд┐рдХрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдХреА рдЕрдХреНрд╕рд░ рдЖрд▓реЛрдЪрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдПрдХ рдЕрд▓рдЧ
@SneakyThrows
рдПрдиреЛрдЯреЗрд╢рди рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рддрд╛ рд╣реИ:
@SneakyThrows
ред рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдпрд╣ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдирд╣реАрдВ рдкрдХрдбрд╝рддрд╛ рд╣реИ рдпрд╛ рдПрдХ
RuntimeException
рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рднреА рд▓рдкреЗрдЯрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдЗрд╕ рддрдереНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ JVM рд░рди рдЯрд╛рдЗрдо рдореЗрдВ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдЬрд╛рд╡реЗрдж рд╣реА рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд▓реЛрдореНрдмреЛрдХ рдЗрд╕ рдЪреЗрдХ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдмрд╛рдпреЛрдЯреЗрдХ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рд╣реИред
public class SneakyThrows { @SneakyThrows public void sneakyThrow() { throw new Exception(); } }
рдХрдВрдзреЗ рд╕реЗ рдХрдВрдзрд╛ рдорд┐рд▓рд╛рдХрд░
рдкреНрд░рддреНрдпрдХреНрд╖ рддреБрд▓рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рджрд┐рдЦрд╛рддреА рд╣реИ рдХрд┐ рд▓реЛрдореНрдмреЛрдХ рдХрд┐рддрдирд╛ рдХреЛрдб рдмрдЪрд╛рддрд╛ рд╣реИред IDE рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдПрдХ "de-lombok" рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд▓рдЧрднрдЧ рдЕрдзрд┐рдХрд╛рдВрд╢
@NonNull
рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рджреЗрд╢реА рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ (
@NonNull
рдПрдиреЛрдЯреЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ
@NonNull
)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдЖрдИрдбреАрдИ рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдореВрд▓ рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рд╡рд╛рдкрд╕ рд╣рдорд╛рд░реЗ
User
рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдПред
@Value @Builder(toBuilder = true) public class User { @NonNull UUID userId; @NonNull String email; @Singular Set<String> favoriteFoods; @NonNull @Builder.Default String avatar = тАЬdefault.pngтАЭ; }
рд▓реЛрдореНрдмреЛрдХ рд╡рд░реНрдЧ рд╕рд┐рд░реНрдл 13 рд╕рд░рд▓, рдкрдардиреАрдп, рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд▓рд╛рдЗрдиреЗрдВ рд╣реИред рд▓реЗрдХрд┐рди рдбреЗ-рд▓рдореНрдмреЛрдХ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдХрдХреНрд╖рд╛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдХреА рд╕реМ рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ!
public class User { @NonNull UUID userId; @NonNull String email; Set<String> favoriteFoods; @NonNull @Builder.Default String avatar = "default.png"; @java.beans.ConstructorProperties({"userId", "email", "favoriteFoods", "avatar"}) User(UUID userId, String email, Set<String> favoriteFoods, String avatar) { this.userId = userId; this.email = email; this.favoriteFoods = favoriteFoods; this.avatar = avatar; } public static UserBuilder builder() { return new UserBuilder(); } @NonNull public UUID getUserId() { return this.userId; } @NonNull public String getEmail() { return this.email; } public Set<String> getFavoriteFoods() { return this.favoriteFoods; } @NonNull public String getAvatar() { return this.avatar; } public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof User)) return false; final User other = (User) o; final Object this$userId = this.getUserId(); final Object other$userId = other.getUserId(); if (this$userId == null ? other$userId != null : !this$userId.equals(other$userId)) return false; final Object this$email = this.getEmail(); final Object other$email = other.getEmail(); if (this$email == null ? other$email != null : !this$email.equals(other$email)) return false; final Object this$favoriteFoods = this.getFavoriteFoods(); final Object other$favoriteFoods = other.getFavoriteFoods(); if (this$favoriteFoods == null ? other$favoriteFoods != null : !this$favoriteFoods.equals(other$favoriteFoods)) return false; final Object this$avatar = this.getAvatar(); final Object other$avatar = other.getAvatar(); if (this$avatar == null ? other$avatar != null : !this$avatar.equals(other$avatar)) return false; return true; } public int hashCode() { final int PRIME = 59; int result = 1; final Object $userId = this.getUserId(); result = result * PRIME + ($userId == null ? 43 : $userId.hashCode()); final Object $email = this.getEmail(); result = result * PRIME + ($email == null ? 43 : $email.hashCode()); final Object $favoriteFoods = this.getFavoriteFoods(); result = result * PRIME + ($favoriteFoods == null ? 43 : $favoriteFoods.hashCode()); final Object $avatar = this.getAvatar(); result = result * PRIME + ($avatar == null ? 43 : $avatar.hashCode()); return result; } public String toString() { return "User(userId=" + this.getUserId() + ", email=" + this.getEmail() + ", favoriteFoods=" + this.getFavoriteFoods() + ", avatar=" + this.getAvatar() + ")"; } public UserBuilder toBuilder() { return new UserBuilder().userId(this.userId).email(this.email).favoriteFoods(this.favoriteFoods).avatar(this.avatar); } public static class UserBuilder { private UUID userId; private String email; private ArrayList<String> favoriteFoods; private String avatar; UserBuilder() { } public User.UserBuilder userId(UUID userId) { this.userId = userId; return this; } public User.UserBuilder email(String email) { this.email = email; return this; } public User.UserBuilder favoriteFood(String favoriteFood) { if (this.favoriteFoods == null) this.favoriteFoods = new ArrayList<String>(); this.favoriteFoods.add(favoriteFood); return this; } public User.UserBuilder favoriteFoods(Collection<? extends String> favoriteFoods) { if (this.favoriteFoods == null) this.favoriteFoods = new ArrayList<String>(); this.favoriteFoods.addAll(favoriteFoods); return this; } public User.UserBuilder clearFavoriteFoods() { if (this.favoriteFoods != null) this.favoriteFoods.clear(); return this; } public User.UserBuilder avatar(String avatar) { this.avatar = avatar; return this; } public User build() { Set<String> favoriteFoods; switch (this.favoriteFoods == null ? 0 : this.favoriteFoods.size()) { case 0: favoriteFoods = java.util.Collections.emptySet(); break; case 1: favoriteFoods = java.util.Collections.singleton(this.favoriteFoods.get(0)); break; default: favoriteFoods = new java.util.LinkedHashSet<String>(this.favoriteFoods.size() < 1073741824 ? 1 + this.favoriteFoods.size() + (this.favoriteFoods.size() - 3) / 3 : Integer.MAX_VALUE); favoriteFoods.addAll(this.favoriteFoods); favoriteFoods = java.util.Collections.unmodifiableSet(favoriteFoods); } return new User(userId, email, favoriteFoods, avatar); } public String toString() { return "User.UserBuilder(userId=" + this.userId + ", email=" + this.email + ", favoriteFoods=" + this.favoriteFoods + ", avatar=" + this.avatar + ")"; } } }
рд╣рдо
UserService
рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗред
@Slf4j @RequiredArgsConstructor @FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE) public class UserService { @NonNull UserDao userDao; }
рдпрд╣рд╛рдБ рдорд╛рдирдХ рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рдПрдХ рдирдореВрдирд╛ рд╕рдордХрдХреНрд╖ рд╣реИред
public class UserService { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(UserService.class); private final UserDao userDao; @java.beans.ConstructorProperties({"userDao"}) public UserService(UserDao userDao) { if (userDao == null) { throw new NullPointerException("userDao is marked @NonNull but is null") } this.userDao = userDao; } }
рдкреНрд░рднрд╛рд╡ рдХреА рд░реЗрдЯрд┐рдВрдЧ
рдЧреНрд░реБрдн рдореЗрдВ рдПрдХ рд╕реМ рд╕реЗ рдЕрдзрд┐рдХ рдЦрд╛рджреНрдп рд╡рд┐рддрд░рдг рд╡реНрдпрд╡рд╕рд╛рдп рд╕реЗрд╡рд╛рдПрдБ рд╣реИрдВред рд╣рдордиреЗ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд▓рд┐рдпрд╛ рдФрд░ рд▓реЛрдореНрдмреЛрдХ рдЗрдВрдЯреЗрд▓реАрдЬ рдкреНрд▓рдЧрдЗрди рдореЗрдВ "рдбреА-рд▓рдореНрдмреЛрдХ" рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд▓рдЧрднрдЧ 180 рдлрд╛рдЗрд▓реЗрдВ рдмрджрд▓ рдЧрдИрдВ, рдФрд░ рд▓реЛрдореНрдмреЛрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ 800 рдорд╛рдорд▓реЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХреЛрдб рдХрд╛ рдЖрдзрд╛рд░ рд▓рдЧрднрдЧ 18,000 рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╡реГрджреНрдзрд┐ рд╣реБрдИред рдФрд╕рддрди, рдкреНрд░рддреНрдпреЗрдХ рд▓реЛрдореНрдмреЛрдХ рд░реЗрдЦрд╛ 23 рдЬрд╛рд╡рд╛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрдЪрд╛рддреА рд╣реИред рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде, рд▓реЛрдореНрдмреЛрдХ рдХреЗ рдмрд┐рдирд╛ рдЬрд╛рд╡рд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред
рд╕рд╛рд░рд╛рдВрд╢
рд▓реЛрдореНрдмреЛрдХ рдПрдХ рдорд╣рд╛рди рд╕рд╣рд╛рдпрдХ рд╣реИ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдирдИ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рд╕рднреА рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЛ рдПрдХ рдирдИ рднрд╛рд╖рд╛ рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд▓реЛрдореНрдмреЛрдХ рд╕рд░реНрд╡рд╢рдХреНрддрд┐рдорд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИред
рд▓реЛрдореНрдмреЛрдХ рдХрд╛ рдПрдХ рдФрд░ рдлрд╛рдпрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд▓рдЧрд╛рддрд╛рд░ рдХреЛрдбрдмреЗрд╕ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреБрдирд┐рдпрд╛ рднрд░ рдореЗрдВ рд╕реМ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрд╡рд╛рдПрдВ рдФрд░ рдПрдХ рд╡рд┐рддрд░рд┐рдд рдЯреАрдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдмреЗрд╕ рдХреА рд╕реБрд╕рдВрдЧрддрддрд╛ рдЯреАрдореЛрдВ рдХреА рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддреА рд╣реИ рдФрд░ рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдмреЛрдЭ рдХреЛ рдХрдо рдХрд░рддреА рд╣реИред рд▓реЛрдореНрдмреЛрдХ рдЬрд╛рд╡рд╛ 6 рдХреЗ рдмрд╛рдж рд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЧреНрд░реБрдн рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рд┐рд░реНрдл рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдпрд╣ рд╕рдм рдХреЛрдб рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛
рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд▓реЛрдореНрдмреЛрдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХреЛрдбрдмреЗрд╕ рдХреЗ рдЙрдмрд╛рдК рднрд╛рдЧреЛрдВ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдЙрди рдЪреАрдЬреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВред рдореЛрдВрдЯреЙрди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕, рд╕рдореАрдХреНрд╖рдХреЛрдВ рдФрд░ рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордп рдХреА рдмрд░реНрдмрд╛рджреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐ рдпрд╣ рдХреЛрдб рдЕрдм рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЯрд╛рдЗрдкреЛ рдХреА рдкреВрд░реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИред
@NonNull
рдХреА рд╢рдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рдСрдЯреЛ
@NonNull
рдХреЗ рд▓рд╛рдн рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЖрдкрдХреА рдореЗрдЬ рдкрд░ рднреЛрдЬрди рдкрд╣реБрдВрдЪрд╛рдирд╛ рд╣реИ!