
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рдРрд╕рд╛ рдХрд╛рдо рд╕рд╛рдордиреЗ рдЖрдпрд╛ рдЬреЛ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рд▓рдЧрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рддреБрдЪреНрдЫ рдерд╛ред рдХреБрдЫ рд╡рд░реНрдЧ (рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп) рд╣реЛрдиреЗ рджреЛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рд▓реНрдбрд░ рд╣реИред рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреВрд░реНрд╡рдЬ рдХреЗ рдмрд┐рд▓реНрдбрд░ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдПрдХ рдмрд┐рд▓реНрдбрд░ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрдЯреМрддреА рдХреЗ рддрд╣рдд, рдореИрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ, рдЕрд╕рдлрд▓ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддрд╛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред
рдЪрд▓реЛ рд╕реНрдкрд╖реНрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
рд╣рдо рдХреЛрдб рдореЗрдВ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреА рд╢рд░реНрддреЛрдВ рдХреЛ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рджреЗрддреЗ рд╣реИрдВ:
public class ImmutableBase { private ImmutableBase(Builder builder) {
рдЕрдм рд╣рдореЗрдВ рдХреБрдЫ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬреЛ ImmutableBase рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВред рдЖрдЗрдП "рд╣реЗрдб-рдСрди" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, ImmutableBase рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдПрдХреНрд╕реЗрд╕ рд╕рдВрд╢реЛрдзрдХ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рдирд╛ рди рднреВрд▓реЗрдВ:
public class MyImmutable extends ImmutableBase { protected MyImmutable(Builder builder) { super(builder);
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд┐рд╕реА рдХреЛ рдХреЗрд╡рд▓ рдмрд┐рд▓реНрдбрд░ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рдХреЙрд▓ рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рдХрд░рдиреА рд╣реИ, рдЙрджрд╛рд╕реА рд╣рдорд╛рд░реЗ рдКрдкрд░ рдХреИрд╕реЗ рдЧрд┐рд░рддреА рд╣реИ:
MyImmutable.java:20: cannot find symbol symbol : method setSomeDouble(double) location: class ImmutableBase.Builder setSomeInt(0).setSomeDouble(0.0).build(); ^
рджрд░рдЕрд╕рд▓, ImmutableBase.Builder рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рддрд░реАрдХреЗ рдЗрд╕рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рди рдХрд┐ рдЗрд╕рдХреЗ рд╡рдВрд╢ рдХреА рдПрдХ рдЖрд╡реГрддреНрддрд┐ред
рджреВрд╕рд░рд╛ рд░рди
MyImmutable.Builder рдореЗрдВ рдЕрдкрдиреЗ рдкреВрд░реНрд╡рдЬ рд╕реЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рддреБрд░рдВрдд рдЦрд╛рд░рд┐рдЬ рдХрд░рдирд╛, рд╣рдо рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд▓реБрднрд╛рд╡рдирд╛ рд╡рд┐рдХрд▓реНрдк рд╕реБрд░рдХреНрд╖рд╛ рдкрд░ рдереВрдХрдирд╛ рдФрд░ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИ
public <B extends Builder> B setSomeString(String value) {
рд▓реЗрдХрд┐рди, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ (рд╕реБрд░рдХреНрд╖рд╛ рдкрд░ рдереВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ!), рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд╕рднреА рд╕рдорд╛рди рддреНрд░реБрдЯрд┐ рджреЗред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрд╛рд╡рд╛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдмрд╕реЗ рд╕рдВрдХреАрд░реНрдг рд╕рдВрднрд╡ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рд▓рд┐рдЦрд╛ рдерд╛ рдХрд┐ рдмрд┐рд▓реНрдбрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреНрд░рдХрд╛рд░ ImmutableBase.Builder рд╣реИред рдЕрдЧрд░ рд╣рдордиреЗ рдпрд╣ рдирд╣реАрдВ рд▓рд┐рдЦрд╛, рддреЛ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдЧрд╛ред рдЖрдк рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдпрд╣ рд▓рд┐рдЦрдХрд░ рдЙрд╕рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
MyImmutable myImmutable = (MyImmutable) builder.setSomeString("0"). <MyImmutable.Builder>setSomeInt(0).setSomeDouble(0.0).build();
рд▓реЗрдХрд┐рди, рдЖрдкрдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЖрдкрдХреЗ рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рд╣рдорд╛рд░реЗ рд╣реИрдВ!
рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд╕рд╛рде рд╡рд┐рдЪрд╛рд░ рд╢рд╛рдпрдж рд╕рд╣реА рдерд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
public static class Builder<B extends Builder<?>> { public B setSomeString(String value) {
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЯрд░реНрдорд┐рдирд▓ рдЦреБрд╢реА рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреА рд╣реИ: рд╣рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдорд┐рд▓рд╛, рд╕реБрд░рдХреНрд╖рд┐рдд, рдФрд░ рдлрд┐рд░ рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:
public static void main(String[] args) { ImmutableBase.Builder<Builder> builder = new ImmutableBase.Builder<Builder>(); MyImmutable myImmutable = builder.setSomeString("0"). setSomeInt(0).setSomeDouble(0.0).build(); }
рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдХрд╛рд░рдг рд╣реЛрдЧрд╛
Exception in thread "main" java.lang.ClassCastException: ImmutableBase$Builder cannot be cast to MyImmutable$Builder at MyImmutable.main(MyImmutable.java:24)
рдЗрд╕ рддрдереНрдп рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдбрд╛рд▓рд╛ рд╣реИ, рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рднреНрд░рдо рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рднреВрд▓ рдЧрдП рд╣реИрдВ рдХрд┐ рд╕рдВрдХрд▓рдХ, рдЬрдм рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЬреЗрдиреЗрд░рд┐рдХ, рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рддрд┐рдпреЛрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдлрд┐рд░ рд╕реЗ рд╣реИ, рдФрд░ рдпрд╣ рдШрд╛рддрдХ рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛: рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ MyImmutable.Builder ImmutableBase.Builder рдХрд╛ рдПрдХ рдЙрдкрд╡рд░реНрдЧ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рд╣рд╛рд▓рдд рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдирд╣реАрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рд╛рдореНрд░рд╛рдЬреНрдп рд╡рд╛рдкрд╕ рд╣рдорд▓рд╛ рдХрд░рддрд╛ рд╣реИ
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рд┐рдореНрдордд рдордд рд╣рд╛рд░рд┐рдП! рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рджрд┐рдЦрд╛рдиреЗ рдФрд░ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЪрд┐рдкрдХреЗ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рдХреЛ рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рдирд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ MyImmutable рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдпрд╣ рдХрд░реЗрдВрдЧреЗ:
public class ImmutableBase { protected ImmutableBase(InnerBuilder<?> builder) {
рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрдирд░рдмрд░реНрд▓реНрдЯ рдХреНрд▓рд╛рд╕ рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╡рд╣ рдЙрд╕рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдЧрдВрджрд╛ рдзреЛрдЦрд╛рдзрдбрд╝реА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ; рдФрд░ рдПрдХ рдмрд┐рд▓реНрдбрд░ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг (рдпрд╛рдиреА рдЬреЗрдирд░рд┐рдХ) рдХреЛ рдЫрд┐рдкрд╛рддреЗ рд╣реБрдП рдкрд╣рд▓реЗ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рддрдм рдпрд╣ рдмрд┐рд▓реНрдбрд░ рдХреЛ MyImmutable рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
public static class Builder extends ImmutableBase.InnerBuilder<Builder> { public Builder setSomeDouble(double value) {
рдФрд░ рдЬреАрд╡рди рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдп рдЕрдВрддрддрдГ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рджреЛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдБ:
- рдмрд┐рд▓реНрдбрд░ рдХреЛ рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ, рддрд╛рдХрд┐ рд╡рд╛рдкрд╕реА рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдП
- рдЕрд▓рдЧ рдХрд░реЗрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреНрдпрд╛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрдпрд╛ рджреЗрдЦреЗрдЧрд╛, рддрд╛рдХрд┐ рд╡рд╣ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрд╡рдХ рдЗрди рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░ рд╕рдХреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдЧрд▓рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХреЗред
рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрд╣рди рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВред
рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЛ рд╕рдордп рдмрдЪрд╛рддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп!