рд╕рд╛рдордЧреНрд░реА
I. рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг
рджреНрд╡рд┐рддреАрдпред рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди
рддреГрддреАрдпред рдкрд╣рд▓реБрдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛ рднрд┐рдиреНрдиред
рдЪрддреБрд░реНрдеред AspectJ рд╕рдорд╛рдзрд╛рди
рд╡реАред рдЧрддрд┐рд╢реАрд▓ рдкрд╣рд▓реВ
рдЫрдареАред рдЙрдкрд╕рдВрд╣рд╛рд░ред
рд╕рд╛рддрд╡реАрдВред рд╕рдиреНрджрд░реНрдн рдФрд░ рд╕рд╛рд╣рд┐рддреНрдп
I. рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг
рдЬрд╛рд╡рд╛ (рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ) рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪрд░ рдФрд░ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡рд░рдг рд╣реЛрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдмреВрд▓рд┐рдпрди, рдЗрдВрдЯреЗрдЧрд░, рдбрдмрд▓ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реЗрдо рд╣реИ (рдЗрд╕рдХреЗ рдмрд╛рдж, рдмреАрди рдХрд╛ рдорддрд▓рдм рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдЬрд╛рд╡рд╛ рдмреАрдиреНрд╕ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ)
public class SomeBean{ private String strField; public void setStrField(String strField){ this.strField=strField; } public String getStrField(){ return strField; }
рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЗрд╕ рдмреАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рдХреНрд╖реЗрддреНрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП:
String s=someBean.getStrField(); if (s!=null){ if (!s.isEmpty()){
рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдХреНрд╖реЗрддреНрд░ рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЬрд▓реНрдж рд╣реА рдпрд╛ рдмрд╛рдж рдореЗрдВ рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд NullPointerException рдХреЗ рдХрд╛рд░рдг рдЖрд╡реЗрджрди рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рдПрдЧрд╛ред рдмреЗрд╢рдХ, рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдирдкрдврд╝ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓реА рдХрд╛ рд╕рдВрдХреЗрдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдирд╛ рджрд░реНрдЬрдиреЛрдВ рд╕рд╛рдорд╛рдиреНрдп рдЖрджреЗрд╢реЛрдВ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдирд▓ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреА рдЬрд╛рдБрдЪ рдмрд╛рд░-рдмрд╛рд░, рдмрд┐рди рдореЗрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рд╣рд░ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХрд░рдиреА рдкрдбрд╝рддреА рд╣реИред рдЕрдзрд┐рдХ рдмрд╛рд░ рдмреАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ, рдЕрдзрд┐рдХ рдмрд╛рд░ рдЖрдкрдХреЛ рдЕрд╢рдХреНрдд рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдЖрдкрдХреЛ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЬреЛ рдХреБрдЫ рдЧреБрдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛрдб рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдХрдо рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛрдб рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЕрдХреНрд╕рд░ рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛ рдореЗрдВ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рд╕реЗ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореЗрд░реЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рднреА рдЗрд╕реА рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реВрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрд╢рдХреНрдд-рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрд╡рд▓реЛрдХрди рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛, рдФрд░ рдПрдХ рдкреНрд░рднрд╛рд╡реА, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдкрд╣рд▓реБрдУрдВ рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рдиред
рджреНрд╡рд┐рддреАрдпред рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди
рдореИрдВрдиреЗ рдорд╛рди рд▓рд┐рдпрд╛ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдореБрдЭрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдпрд╣ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдФрд░ рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреА рд╣реИред
1) JSR-305 рд╕реЗ рдПрдиреЛрдЯреЗрд╢рди @ NotNull рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ [1] рдФрд░ [2]ред
рдпрд╣ рдЦреЗрддреЛрдВ рдФрд░ рддрд░реАрдХреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдкреВрд░реНрд╡-рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЖрдИрдбреАрдИ рд╕рдорд╕реНрдпрд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕реНрд░реЛрдд рд╕реНрддрд░ рдкрд░ рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
@NotNull public Color notNullMethod(){ return null; }
рдиреБрдХрд╕рд╛рди: рдПрдиреЛрдЯреЗрд╢рди рд╕реНрд╡рдпрдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рднреА рд╕рдорд╕реНрдпрд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, JSR-305 рдЬрдЯрд┐рд▓ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред
2) рдЪреЗрдХрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ JSR-308 [3] рдФрд░ [4] рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред
рдирд▓ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╕рдордп рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдЬрд╛рдБрдЪ рд╢реБрд░реВ рдХрд░рдХреЗ JSR-305 рд╕реЗ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рддрдХрдиреАрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ, рдкреНрд░рдХрд╛рд░, рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдФрд░ рдЕрдиреНрдп рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рдПрдиреЛрдЯреЗрд╢рди рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд▓рд╛рдн: рд╡рд┐рдХрд╕рд┐рдд рд░реВрдкрд░реЗрдЦрд╛
рдЪрд░реНрдЪрд╛ рдХреЗ рддрд╣рдд рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдиреБрдХрд╕рд╛рди: @ рдиреЛрдЯрдирд▓ рдПрдиреЛрдЯреЗрд╢рди рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд╕рднреА рд╕рдорд╕реНрдпрд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд░рдЦрдирд╛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
3) рдЬрд╛рд╡рд╛ рдПрдиреЛрдЯреЗрд╢рди рдЪреЗрдХрд░ (JACK) [5] рдХреЗ рдкрд╛рд╕ JSR-305 рдХреЗ рд╕рдорд╛рди рд╣реА рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рд╣реИрдВ
4) рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рд┐рдХреНрдХрд╛, рдЬрд┐рд╕рдореЗрдВ рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ (рдЧреНрд░реВрд╡реА рднрд╛рд╖рд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд), [6] рдФрд░ [7] рдореЗрдВ рдХрдИ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рдорд╛рд░реЛрд╣ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
public String getPostcode(Person person){ if (person != null){ Address address = person.getAddress(); if (address != null){ return address.getPostcode(); } } return null; }
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЙрдЗрди рдХреЗ рд╕реБрдЭрд╛рд╡ рдкрд░, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ NullSafe-рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
public String getPostcode(Person person){ return person?.getAddress()?.getPostcode(); }
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдУрд░реЗрдХрд▓ рдиреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЬрд╛рд╡рд╛ 7 рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдХреЛ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрддреЛрд╖ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред
5) рдЧреНрд░реВрд╡реА рднрд╛рд╖рд╛ рдХрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧред рджрд░рдЕрд╕рд▓, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдирд▓рд╕реИрдл-рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╡рд╣рд╛рдВ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ [8] рдЧрдпрд╛ред
рдкреНрд▓рд╕: рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЛрдб рд╕рд░рд▓реАрдХрд░рдг
рдиреБрдХрд╕рд╛рди: рдЖрдкрдХреЛ рдЕрднреА рднреА рд╕рднреА рд╕рдорд╕реНрдпрд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
6) рдЕрдкрд╛рдЪреЗ рдХреЙрдордиреНрд╕, рд╕реНрдЯреНрд░рд┐рдВрдЧрд░рд┐рд▓реНрдЯреНрд╕ [реп] рдФрд░ рдкреНрд░реЙрдкрд░реНрдЯреАрдпреВрдЯрд┐рд▓реНрд╕ [резреж]:
StringUtils.isBlank(null)= true StringUtils.isBlank("")= true StringUtils.isBlank(" ")= true String firstName = (String) PropertyUtils.getSimpleProperty(employee, "firstName"); String city = (String)PropertyUtils.getNestedProperty(employee, "address(home).city");
рд▓рд╛рдн: рдЪреЗрдХ рдХрд╛ рд╕рд░рд▓реАрдХрд░рдг
рдиреБрдХрд╕рд╛рди: рдЖрдкрдХреЛ рдЬрд╣рд╛рдВ рдХрд╣реАрдВ рднреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред PropertyUtils рджреНрд╡рд╛рд░рд╛ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
7) рдлрд╛рдЗрдВрдбрдмрдЧреНрд╕ [11] рдФрд░ рдкреАрдПрдордбреА [12] рд╕реНрдЯреИрдЯрд┐рдХ рдХреЛрдб рдПрдирд╛рд▓рд╛рдЗрдЬрд░, рдЬрд┐рдирдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдИрдбреАрдИ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧ-рдЗрди рд╣реИрдВред
рд▓рд╛рдн: рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдг рдЬреЛ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рдмрд┐рдирд╛ рд╕реНрдерд┐рд░ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВред
рдиреБрдХрд╕рд╛рди: рд╕рдорд╕реНрдпрд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рджрд┐рдЦрд╛рдПрдВ, рд▓реЗрдХрд┐рди рдПрдХ рддреИрдпрд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рди рдХрд░реЗрдВред
рддреГрддреАрдпред рдкрд╣рд▓реВ рдХреЗ рдмрд┐рдирд╛ рд╕рдорд╛рдзрд╛рди
рдЕрд╢рдХреНрдд рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдирд╛, рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреА рддрд░рд╣, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЕрдХреНрд╕рд░ (рд▓реЗрдЦрди) рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд░реАрдб рдСрдкрд░реЗрд╢рди рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реЗрдо рдХреЗ рдЦреЗрддреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
public class SomeBean{ private String strField=""; public void setStrField(String strField){ if (strField!=null){ this.strField=strField; } } public String getStrField(){ return strField; } }
рдЕрд╢рдХреНрдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдлрд┐рд░ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЦреЗрддреЛрдВ рдХреЛ рд╢реБрд░реВ рдореЗрдВ рдмрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдорд┐рд▓рдХрд░ рдЖрдкрдХреЛ рдЕрд╢рдХреНрдд-рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рдЕрд╢рдХреНрдд рдХреЗ рд▓рд┐рдП рдХрдИ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХреЛрдб рдХреЗ рд▓реЗрдЦрди рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдЧреБрдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред
рд▓рд╛рдн: рдРрд╕реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╢рдХреНрддрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред
рдиреБрдХрд╕рд╛рди: рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдФрд░ рдПрдХ рдирд▓ рдХреНрд▓рд┐рдкрд┐рдВрдЧ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдЪрддреБрд░реНрдеред AspectJ рд╕рдорд╛рдзрд╛рди
рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдирд▓ рдХрддрд░рди рд╕рд┐рд░реНрдл рдЙрди рдкрд╣рд▓реБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдзрд╛рди рдорд╛рдВрдЧрддрд╛ рд╣реИ рдЬреЛ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдлрд╝реАрд▓реНрдб рд╕реНрддрд░ рдкрд░ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рдмрд┐рди рдХреЗ рдЕрдВрджрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдлрд╝реАрд▓реНрдб рдФрд░ рд╕рдВрдкреВрд░реНрдг рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо NullSafe рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ:
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) public @interface NullSafe { boolean getter() default true; }
@NullSafe (рдЧреЗрдЯреНрдЯрд░ = рдЧрд▓рдд)
- рддрд░реНрдХ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмрд┐рди рдореЗрдВ рдЦреЗрддреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рдирд╣реАрдВ рдерд╛, рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдкрд╣рд▓реВ рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рд╣реИред
рднрд╡рд┐рд╖реНрдп рдХреЗ рдЖрд╕рд╛рди рд╕рдВрд╢реЛрдзрди рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реВ рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдПрд╕реНрдкреЗрдХреНрдЯ 5 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ 5+ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд╣рд▓реБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг [13], [14], [15] рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
@Aspect public class NullSafeAspect { @Pointcut(value="within(@NullSafe *)")
рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЖрд╡реЗрджрди рдЙрджрд╛рд╣рд░рдг:
@NullSafe public class SomeClassTestByClass extends SomeClass { ... } @NullSafe private String strField; @NullSafe private HashMap<Integer,HashMap<String,String>> map; @NullSafe(getter=false) private ArrayList<String> listString=new ArrayList<String>();
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрд╕ рдкрд╣рд▓реВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИред @Pointcut рдПрдиреЛрдЯреЗрд╢рди рдорд╛рдирдХ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рднреАрддрд░ - рдХрд╛ рдЕрд░реНрде рд╣реИ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЛрдИ рднреА рд╡рд░реНрдЧ @ NullSafe рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реИред рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ Long, Integer, Double, Float, Short, Byte, BigDecimal, рдЬреЛ рдПрдХ рд╣реА рдкреИрдЯрд░реНрди рджреНрд╡рд╛рд░рд╛ рдЖрд░рдореНрдн рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдмреБрд▓рд┐рдпрди, рдЪрд░рд┐рддреНрд░ рднреА рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд░реИрдкрд░ рдХрдХреНрд╖рд╛рдПрдВ рдкрд╣рд▓реВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЖрдк рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдмрд┐рди рдпрд╛ рд╡рд░реНрдЧ рд╕рд╣рд╛рдпрдХ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд┐рдирд╛ рдПрдиреЛрдЯреЗрдЯ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрд▓рд╛рд╕ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЕрд░реНрде рд╣реИ рд╕рднреА рд╕рдорд░реНрдерд┐рдд рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рдкреВрд░реНрдг рд╕рдорд░реНрдердиред рдЗрди рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХреЛрдб рдореЗрдВ рдлрд╝реАрд▓реНрдбреНрд╕ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ @ NullSafe (рдЧреЗрдЯреНрдЯрд░ = рдЧрд▓рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЧреЗрдЯрд░реНрд╕ рдХреЛ рдЫреЛрдбрд╝ рдХрд░ рдЧрддрд┐ рдмрдврд╝рд╛рдПрдЧрд╛ред рд╕реЗрдЯ () рдФрд░ рдорд┐рд▓рддрд╛ рд╣реИ () - рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдкрд░, рд╡реЗ рдмрд┐рди рдХреНрд╖реЗрддреНрд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдпрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдмрд┐рди рдХреЗ рдЕрдВрджрд░ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред @ Advice рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╕реЗрдЯ рдЯреВ рдЗрдВрдЯреНрд░рд╕реНрдЯ рд╕реЗрдЯ () рд╕реЗ
рдкрд╣рд▓реЗ рдЯрд┐рдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдирд╛ рдкрдбрд╝рд╛, рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдерд╛ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрдХ рдкрд╣рд▓реВ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рднреА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдкрд╣рд▓реВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг NullSafe рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ [18] рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдлрд╛рдпрджрд╛: рдПрдВрдб-рдЯреВ-рдПрдВрдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗрд╡рд▓ рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛред
рдиреБрдХрд╕рд╛рди: рдЖрдкрдХреЛ рдЕрднреА рднреА рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ рдПрдиреЛрдЯреЗрд╢рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ @ NullSafe рдПрдиреЛрдЯреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдмрд┐рдирд╛ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд░реЙрд╕-рдХрдЯрд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореБрдЭреЗ рдПрдХ рдЧрд▓рдд рд╕рдорд╛рдзрд╛рди рд▓рдЧрддрд╛ рд╣реИред
рд╡реАред рдЧрддрд┐рд╢реАрд▓ рдкрд╣рд▓реВ
рдкрд╣рд▓реВ рдЖрдорддреМрд░ рдкрд░ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рд╕рдВрд╢реЛрдзрди рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдПрдХ рдЬрдЯрд┐рд▓ рд╡рд┐рд╡рд░рдг рд╕рдорд╛рдкреНрдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдЧрддрд┐ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред AspectJ рдмреВрдЯрд▓реЛрдбрд░ рдХреЛ рдмрджрд▓рдХрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрдм рдмрд╛рдЗрдЯрдХреЛрдб рдХреЗ рдкрд╣рд▓реБрдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрд░реЛрдд рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ NullSafeAspect рдкрд╣рд▓реВ рдореЗрдВ рдХреБрдЫ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЙрд▓реНрд▓реЗрдЦ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╛ рдПрдХ рдирдпрд╛ рдкрд╣рд▓реВ рдмрдирд╛рдПрдВ рдЬреЛ рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ)ред рдЪреВрдВрдХрд┐ рдпрд╣ рддрдХрдиреАрдХ рд╡рд┐рднрд┐рдиреНрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рдФрд░ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛ред рдЧрддрд┐рд╢реАрд▓ рдкрд╣рд▓реБрдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА [резрем] рдФрд░ [рез of] рдореЗрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред
рдЫрдареАред рдЕрдВрддрднрд╛рд╖рдг
рдпрд╣ рд▓реЗрдЦ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рджреЗрдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИред рд╢рд╛рдпрдж рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдЕрд╢рдХреНрдд рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдпрд╣ рдЕрдХреНрд╕рд░ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдЗрд╖реНрдЯрддрдо рд╣реИ рдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рдмрдЧ-рдкреНрд░реВрдл рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рддрдХрдиреАрдХ рдмрди рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЬрд╛рд╡рд╛ рдореЗрдВ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдореЗрдВ рд╕реЗ рдПрдХ рдмрди рд╕рдХрддрд╛ рд╣реИред
рд╕рд╛рддрд╡реАрдВред рд╕рдВрджрд░реНрдн рдФрд░ рд╕рд╛рд╣рд┐рддреНрдп *
1.
jcp.org/en/jsr/detail?id=3052.
www.jetbrains.com/idea/documentation/howto.html3.
jcp.org/en/jsr/detail?id=3084.
type.cs.washington.edu/checker-framework/current/checkers-manual.html5.
homepages.ecs.vuw.ac.nz/~djp/JACK6.
blogs.oracle.com/darcy/entry/project_coin_final_five7.
metoojava.wordpress.com/2010/11/15/java-7-awesome-features8.
groovy.codehaus.org/Operators9.
commons.apache.org/lang/api-2.5/org/apache/commons/lang/Stringtt.html10.
commons.apache.org/beanutils/apidocs/org/apache/commons/beanutils/package-summary.html#package_description11.
findbugs.sourceforge.net12.
pmd.sourceforge.net13.
eclipse.org/aspectj/doc/released/adk15notebook/index.html14.
eclipse.org/aspectj/doc/released/progguide/index.html15. рдПрдХреНрд╢рди рдореЗрдВ рдПрд╕реНрдкреЗрдХреНрдЯрдЬред рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдгред рдЖрдИрдПрд╕рдмреАрдПрди 978-1-933988-05-4
16.
www.eclipse.org/aspectj/doc/next/devguide/ltw.html17.
static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.html#aop-aj-ltw18.
sourceforge.net/projects/nullsafe/files* рд▓реЗрдЦрди рдХреЗ рд╕рдордп рд╕рднреА рдЗрдВрдЯрд░рдиреЗрдЯ рд▓рд┐рдВрдХ рдорд╛рдиреНрдп рдереЗ
02/2013 рдУрд▓реЗрдЧ рдирд┐рдХреЛрд▓реЗрдиреНрдХреЛ