рдХреНрд▓рд╛рд╕рд┐рдХ рд╕реНрдХрд╛рд▓рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди

рд▓реЗрдЦрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:
Pavel Fatin JetBrains рдореЗрдВ IntelliJ IDEA рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХрд╛рд▓рд╛ рдкреНрд▓рдЧрдЗрди рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рдкрд░рд┐рдЪрдп



рдпрд╣ рдЖрд▓реЗрдЦ рдЙрджрд╛рд╣рд░рдг рджреЗрдЧрд╛ рдХрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕реНрдХрд╛рд▓рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд▓реЗрдЦ рдХреА рд╕рд╛рдордЧреНрд░реА рдЬрд╛рд╡рд╛рдбрд╛рдп рд╕рдореНрдореЗрд▓рди ( рдкреНрд░рд╕реНрддреБрддрд┐ рд╕реНрд▓рд╛рдЗрдб ) рдореЗрдВ рдореЗрд░реА рдкреНрд░рд╕реНрддреБрддрд┐ рдХрд╛ рдЖрдзрд╛рд░ рдмрдирддреА рд╣реИ ред



рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди



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

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди



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

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

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

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

рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдЕрд╡рд▓реЛрдХрди



рдЬрдирд░реЗрдЯрд┐рд╡ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди ( рд░рдЪрдирд╛рддреНрдордХ рдкреИрдЯрд░реНрди ):



рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреИрдЯрд░реНрди :



рд╡реНрдпрд╡рд╣рд╛рд░ рдкреИрдЯрд░реНрди:



рдЗрд╕рдХреЗ рдмрд╛рдж, рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рд╕рднреА рдХреЛрдб рдЬреАрдердм рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ )ред

рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди



рдлреИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐


рдлреИрдХреНрдЯреНрд░реА рдореЗрдердб рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдирд┐рд░реНрдгрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрд┐рд╕ рд╡рд░реНрдЧ рдХреЛ рдмрдирд╛рдирд╛ рд╣реИред

рдкреИрдЯрд░реНрди рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


рд╕реНрдЯреЗрдЯрд┐рдХ рдлреИрдХреНрдЯреНрд░реА рдореЗрдердб рдкреИрдЯрд░реНрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЬреЛ рдХрд┐ рдлреИрдХреНрдЯреНрд░реА рдореЗрдердб рдкреИрдЯрд░реНрди рдХреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдереЛрдбрд╝рд╛ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ред ред

рдЬрд╛рд╡рд╛ рдореЗрдВ , рдирдП рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рддрддреНрдХрд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд╕реАрдзреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

public interface Animal {} 


 public class Dog implements Animal {} 


 public class Cat implements Animal {} 


 public class AnimalFactory { public static Animal createAnimal(String kind) { if ("cat".equals(kind)) { return new Cat(); } if ("dog".equals(kind)) { return new Dog(); } throw new IllegalArgumentException(); } } 


рдПрдХ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдХреБрддреНрддрд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред

 Animal animal = AnimalFactory.createAnimal("dog"); 


рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдХрд╛рд▓рд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рд░рдЦрд╛рдирд╛ рд╡рд┐рдзрд┐ рд╣реИ:

 trait Animal private class Dog extends Animal private class Cat extends Animal object Animal { def apply(kind: String) = kind match { case "dog" => new Dog() case "cat" => new Cat() } } 


рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 Animal("dog") 


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

рдкреЗрд╢реЗрд╡рд░реЛрдВ:



рд╡рд┐рдкрдХреНрд╖:



рдЖрд▓рд╕реА рдЖрд░рдВрднреАрдХрд░рдг


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

рдЖрдорддреМрд░ рдкрд░, рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдирд▓ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдЕрд╕рдВрдЧрдард┐рдд рд░рд╛рдЬреНрдп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдпрджрд┐ рд╢реВрдиреНрдп рдПрдХ рдорд╛рдиреНрдп рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реНрдб рд╡реИрд▓реНрдпреВ рд╣реИ, рддреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕реНрдЯреЗрдЯ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдзреНрд╡рдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХреЛрдб рдореЗрдВ, рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдзреНрд╡рдЬ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдмреЗрд╣рддрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдбрдмрд▓-рдЪреЗрдХ рд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдЧреЗ рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИред

 private volatile Component component; public Component getComponent() { Component result = component; if (result == null) { synchronized(this) { result = component; if (result == null) { component = result = new Component(); } } } return result; } 


рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 Component component = getComponent(); 


рд╕реНрдХрд╛рд▓рд╛ рдПрдХ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

 lazy val x = { print("(computing x) ") 42 } 


рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 print("x = ") println(x) // x = (computing x) 42 


рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рд╡рд┐рд▓рдВрдмрд┐рдд рдЖрд░рдВрднреАрдХрд░рдг рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓рдВрдмрд┐рдд рдореВрд▓реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ



рд╡рд┐рдкрдХреНрд╖



рд╕рд┐рдВрдЧрд▓рдЯрди (рд╕рд┐рдВрдЧрд▓рдЯрди)


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

рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреАрд╡рд░реНрдб рд╕реНрдерд┐рд░ рд╣реИ , рдЬреЛ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ (рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг) рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХреА рдХрдореА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ; рдЗрд╕ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рддрд░реАрдХреЗ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рджреМрд░рд╛рди рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗред рдЗрд╕ рддрд░рд╣ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдореВрд▓ OOP рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдЪрд▓рддреА рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдПрдХ рд╡рд╕реНрддреБ рд╣реИред

рддреЛ, рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ (рд╕рдВрднрд╡рддрдГ рд╡рд┐рд▓рдВрдмрд┐рдд рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд╕рд╛рде)ред

 public class Cat implements Runnable { private static final Cat instance = new Cat(); private Cat() {} public void run() { // do nothing } public static Cat getInstance() { return instance; } } 


рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 Cat.getInstance().run() 


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

рд╕реНрдХрд╛рд▓рд╛ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдореИрдХреЗрдирд┐рдЬреНрдо рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

 object Cat extends Runnable { def run() { // do nothing } } 


рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 Cat.run() 


рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ, рд╡рд╕реНрддреБрдПрдВ рдХрдХреНрд╖рд╛рдУрдВ рдпрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╕реАрдзреЗ рдпрд╛ рдПрдХ рд╡рд┐рд░рд╛рд╕рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)ред рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ , рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдорд╛рдВрдЧ рдкрд░ рдЖрд╕реНрдердЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ



рд╡рд┐рдкрдХреНрд╖



рдЕрдиреБрдХреВрд▓рдХ


рдПрдбреЗрдкреНрдЯрд░ рдкреИрдЯрд░реНрди рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЗрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдореМрдЬреВрджрд╛ рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдбреЗрдкреНрдЯрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред

рдЬрд╛рд╡рд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ рдХреЛрдб рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 public interface Log { void warning(String message); void error(String message); } public final class Logger { void log(Level level, String message) { /* ... */ } } public class LoggerToLogAdapter implements Log { private final Logger logger; public LoggerToLogAdapter(Logger logger) { this.logger = logger; } public void warning(String message) { logger.log(WARNING, message); } public void error(String message) { logger.log(ERROR, message); } } 


рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 Log log = new LoggerToLogAdapter(new Logger()); 


рд╕реНрдХреИрд▓рд╛ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд░реНрдЧред

 trait Log { def warning(message: String) def error(message: String) } final class Logger { def log(level: Level, message: String) { /* ... */ } } implicit class LoggerToLogAdapter(logger: Logger) extends Log { def warning(message: String) { logger.log(WARNING, message) } def error(message: String) { logger.log(ERROR, message) } } 


рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 val log: Log = new Logger() 


рдпрджреНрдпрдкрд┐ рд▓реЙрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ, рд╕реНрдХрд╛рд▓рд╛ рд╕рдВрдХрд▓рдХ рд▓реЙрдЧрдЧрд░ рд╡рд░реНрдЧ рдХреЛ рддреБрд░рдВрдд рдмрджрд▓ рджреЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдПрдХ рдПрдбрд╛рдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯ рджреЗрдЧрд╛ред

рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ



рд╡рд┐рдкрдХреНрд╖



рдбреЗрдХреЛрд░реЗрдЯрд░ (рдбреЗрдХреЛрд░реЗрдЯрд░)


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

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

 public interface OutputStream { void write(byte b); void write(byte[] b); } public class FileOutputStream implements OutputStream { /* ... */ } public abstract class OutputStreamDecorator implements OutputStream { protected final OutputStream delegate; protected OutputStreamDecorator(OutputStream delegate) { this.delegate = delegate; } public void write(byte b) { delegate.write(b); } public void write(byte[] b) { delegate.write(b); } } public class BufferedOutputStream extends OutputStreamDecorator { public BufferedOutputStream(OutputStream delegate) { super(delegate); } public void write(byte b) { // ... delegate.write(buffer) } } 


рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 new BufferedOutputStream(new FileOutputStream("foo.txt")); 


рдПрдХ рд╣реА рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдХрд╛рд▓рд╛ рдЕрдкрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдмрдВрдзреЗ рдмрд┐рдирд╛, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реАрдзрд╛ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

 trait OutputStream { def write(b: Byte) def write(b: Array[Byte]) } class FileOutputStream(path: String) extends OutputStream { /* ... */ } trait Buffering extends OutputStream { abstract override def write(b: Byte) { // ... super.write(buffer) } } 


рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 new FileOutputStream("foo.txt") with Buffering // with Filtering, ... 


рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрди рд╕рдВрдХрд▓рд┐рдд рд╕рдордп рдкрд░ рд╡рд┐рдзрд┐рд╡рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рддрдм рддрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм рддрдХ рд╣рдо рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдЙрд╕ рд╕рдордп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ, рдЗрд╕ рд╕рдЬрд╛рд╡рдЯ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╕реНрдЯреИрдХреЗрдмрд▓ рдЯреНрд░реЗрдЯ рдкреИрдЯрд░реНрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ



рд╡рд┐рдкрдХреНрд╖



рдорд╛рди рд╡рд╕реНрддреБ


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

рдореВрд▓реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИ; рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рдЧреЗрдЯрд░ рддрд░реАрдХреЛрдВ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реАрдХреЛрдВ (рдмрд░рд╛рдмрд░, рд╣реИрд╢рдХреЛрдб, рд╕реНрдЯреНрд░реАрдВрдЧ) рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 public class Point { private final int x, y; public Point(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } public boolean equals(Object o) { // ... return x == that.x && y == that.y; } public int hashCode() { return 31 * x + y; } public String toString() { return String.format("Point(%d, %d)", x, y); } } 


рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 Point point = new Point(1, 2) 


рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ , рдЖрдк рдореВрд▓реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрдпреВрдкрд▓реНрд╕ рдпрд╛ рдХреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм рдПрдХ рдЕрд▓рдЧ рдХреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЯреНрдпреВрдкрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 val point = (1, 2) // new Tuple2(1, 2) 


рдЯрдкреНрд▓реНрд╕ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп "рд╕рдВрдЧреНрд░рд╣" рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЯреНрдпреВрдкрд▓реНрд╕ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдЧреЗрдЯреНрдЯрд░ рдореЗрдердб рдФрд░ рд╕рднреА рд╣реЗрд▓реНрдкрд░ рдореЗрдердб рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

 type Point = (Int, Int) // Tuple2[Int, Int] val point: Point = (1, 2) 


рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдПрдХ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рд╡рд░реНрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдпрд╛ рдЬрдм рдбреЗрдЯрд╛ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рдирд╛рдо рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдХреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 case class Point(x: Int, y: Int) val point = Point(1, 2) 


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

рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ



рд╡рд┐рдкрдХреНрд╖

рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИрдВред

рдЕрд╢рдХреНрдд рд╡рд╕реНрддреБрдПрдБ


рдПрдХ рдЕрд╢рдХреНрдд рд╡рд╕реНрддреБ рдПрдХ рдирд┐рд╖реНрдкрдХреНрд╖, "рдирд┐рд╖реНрдХреНрд░рд┐рдп" рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╡рд╕реНрддреБ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рд╣реИред

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

рдЬрд╛рд╡рд╛ рдореЗрдВ, рдкреИрдЯрд░реНрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди "рдЦрд╛рд▓реА" рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЙрдкрд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ:

 public interface Sound { void play(); } public class Music implements Sound { public void play() { /* ... */ } } public class NullSound implements Sound { public void play() {} } public class SoundSource { public static Sound getSound() { return available ? music : new NullSound(); } } SoundSource.getSound().play(); 


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

Scala рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдореВрд▓реНрдп рдХреЗ "рдХрдВрдЯреЗрдирд░" рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 trait Sound { def play() } class Music extends Sound { def play() { /* ... */ } } object SoundSource { def getSound: Option[Sound] = if (available) Some(music) else None } for (sound <- SoundSource.getSound) { sound.play() } 


рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ



рд╡рд┐рдкрдХреНрд╖



рд░рдгрдиреАрддрд┐ (рд░рдгрдиреАрддрд┐)


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

рдЬрд╛рд╡рд╛ рдореЗрдВ , рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдзрд╛рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рджреЗрдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рдХрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ:

 public interface Strategy { int compute(int a, int b); } public class Add implements Strategy { public int compute(int a, int b) { return a + b; } } public class Multiply implements Strategy { public int compute(int a, int b) { return a * b; } } public class Context { private final Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void use(int a, int b) { strategy.compute(a, b); } } new Context(new Multiply()).use(2, 3); 


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

 type Strategy = (Int, Int) => Int class Context(computer: Strategy) { def use(a: Int, b: Int) { computer(a, b) } } val add: Strategy = _ + _ val multiply: Strategy = _ * _ new Context(multiply).use(2, 3) 


рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╣рд╛рдВ рд░рдгрдиреАрддрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдХрдИ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЖрдк рдХреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдпрд╛ рд╕рдореВрд╣ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрдкрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ



рд╡рд┐рдкрдХреНрд╖



рдХрдорд╛рди (рдХрдорд╛рди)


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

рдЬрд╛рд╡рд╛ рдореЗрдВ, рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдореЗрдВ рдХреЙрд▓ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЯрд░реНрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрддрд╛ рд╣реИред

 public class PrintCommand implements Runnable { private final String s; PrintCommand(String s) { this.s = s; } public void run() { System.out.println(s); } } public class Invoker { private final List<Runnable> history = new ArrayList<>(); void invoke(Runnable command) { command.run(); history.add(command); } } Invoker invoker = new Invoker(); invoker.invoke(new PrintCommand("foo")); invoker.invoke(new PrintCommand("bar")); 


рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдЖрд╕реНрдердЧрд┐рдд рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрдВрддреНрд░ рд╣реИ:
 object Invoker { private var history: Seq[() => Unit] = Seq.empty def invoke(command: => Unit) { // by-name parameter command history :+= command _ } } Invoker.invoke(println("foo")) Invoker.invoke { println("bar 1") println("bar 2") } 


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

рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ



рд╡рд┐рдкрдХреНрд╖



рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛


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

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

 public abstract class EventHandler { private EventHandler next; void setNext(EventHandler handler) { next = handler; } public void handle(Event event) { if (canHandle(event)) doHandle(event); else if (next != null) next.handle(event); } abstract protected boolean canHandle(Event event); abstract protected void doHandle(Event event); } public class KeyboardHandler extends EventHandler { // MouseHandler... protected boolean canHandle(Event event) { return "keyboard".equals(event.getSource()); } protected void doHandle(Event event) { /* ... */ } } 


рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 KeyboardHandler handler = new KeyboardHandler(); handler.setNext(new MouseHandler()); 


рд╕реНрдХреИрд▓рд╛ рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН рдЖрдВрд╢рд┐рдХ рдХрд╛рд░реНрдп ред рдПрдХ рдЖрдВрд╢рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рдмрд╕реЗрдЯ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ isDefinedAt рдФрд░ рд▓рд╛рдЧреВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ getOrElse рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛

 case class Event(source: String) type EventHandler = PartialFunction[Event, Unit] val defaultHandler: EventHandler = PartialFunction(_ => ()) val keyboardHandler: EventHandler = { case Event("keyboard") => /* ... */ } def mouseHandler(delay: Int): EventHandler = { case Event("mouse") => /* ... */ } 


 keyboardHandler.orElse(mouseHandler(100)).orElse(defaultHandler) 


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

рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ



рд╡рд┐рдкрдХреНрд╖



рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди


рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдкреИрдЯрд░реНрди рд░рди-рдЯрд╛рдЗрдо рдкрд░ рдпрд╛ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдмрдЪрддрд╛ рд╣реИред рдПрдХ рдкреИрдЯрд░реНрди рдХрдВрдЯреНрд░реЛрд▓ рдСрдл рдХрдВрдЯреНрд░реЛрд▓ (IoC) рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИред

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

рдЖрдИрдУрд╕реА рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ (рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИред

 public interface Repository { void save(User user); } public class DatabaseRepository implements Repository { /* ... */ } public class UserService { private final Repository repository; UserService(Repository repository) { this.repository = repository; } void create(User user) { // ... repository.save(user); } } new UserService(new DatabaseRepository()); 


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

рдЖрдк рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрд╡-рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 trait Repository { def save(user: User) } trait DatabaseRepository extends Repository { /* ... */ } trait UserService { self: Repository => // requires Repository def create(user: User) { // ... save(user) } } new UserService with DatabaseRepository 


рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрдХ рдкреИрдЯрд░реНрди рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ; рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдЕрдиреНрдп рддрд░реАрдХреЗ рднреА рд╣реИрдВред

рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ "рдорд┐рд╢реНрд░рдг" рд╕реНрдерд┐рд░ рд╣реИ, рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЗрддрдиреА рдмрд╛рд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╕рдВрдХрд▓рди рдЪрд░рдг рдкрд░ рд╕реНрдереИрддрд┐рдХ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рднреЛрдВ рдХрд╛ XML рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИред

рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ



рд╡рд┐рдкрдХреНрд╖



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



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

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


All Articles