рдмрд┐рд▓реНрдбрд░ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ ред
рдпрд╣ рд╕рд░рд▓ рд╣реИ, рдпрд╣ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓реЛрдореНрдмреЛрдХ рдпрд╛ рдЗрдореНрдпреВрдЯреЗрдмрд▓реНрд╕ рдореЗрдВ @Builder рдЬреИрд╕реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдкреИрдЯрд░реНрди рдЬрд╛рд╡рд╛ рдореЗрдВ рдЗрддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ?
рдЗрд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЪреЗрдирд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
public class User {
private final String firstName;
private final String lastName;
User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public static Builder builder() {
return new Builder();
}
public static class Builder {
String firstName;
String lastName;
Builder firstName(String value) {
this.firstName = value;
return this;
}
Builder lastName(String value) {
this.lastName = value;
return this;
}
public User build() {
return new User(firstName, lastName);
}
}
}
User.Builder builder = User.builder().firstName("Sergey").lastName("Egorov");
if (newRules) {
builder.firstName("Sergei");
}
User user = builder.build();
:
- User тАФ , .
- , User .
- Builder , User .
- this ( Builder).
тАж ?
, User:
public class RussianUser extends User {
final String patronymic;
RussianUser(String firstName, String lastName, String patronymic) {
super(firstName, lastName);
this.patronymic = patronymic;
}
public static RussianUser.Builder builder() {
return new RussianUser.Builder();
}
public static class Builder extends User.Builder {
String patronymic;
public Builder patronymic(String patronymic) {
this.patronymic = patronymic;
return this;
}
public RussianUser build() {
return new RussianUser(firstName, lastName, patronymic);
}
}
}
RussianUser me = RussianUser.builder()
.firstName("Sergei")
.patronymic("Valeryevich")
.lastName("Egorov")
.build();
, firstName :
User.Builder firstName(String value) {
this.value = value;
return this;
}
Java- , this RussianUser.Builder, User.Builder!
:
RussianUser me = RussianUser.builder()
.patronymic("Valeryevich")
.firstName("Sergei")
.lastName("Egorov")
.build()
;
: self typing
тАФ User.Builder , , :
public static class Builder<SELF extends Builder<SELF>> {
SELF firstName(String value) {
this.firstName = value;
return (SELF) this;
}
RussianUser.Builder:
public static class Builder extends User.Builder<RussianUser.Builder> {
:
RussianUser.builder()
.firstName("Sergei")
.patronymic("Valeryevich")
.lastName("Egorov")
.build();
:
class A<SELF extends A<SELF>> {
SELF self() {
return (SELF) this;
}
}
class B<SELF extends B<SELF>> extends A<SELF> {}
class C extends B<C> {}
, ? тАж !
, !
new A<A<A<A<A<A<A<...>>>>>>>()
, ( Kotlin):
A a = new A<>();
┬л ┬╗ (raw types) diamond operator Java. , , , .
: Self typing Java
: ( , ).
, JEP .
P.S. - , JEP? ;)
Self typing Swift.
Java-:
class A {
@Self
void withSomething() {
System.out.println("something");
}
}
class B extends A {
@Self
void withSomethingElse() {
System.out.println("something else");
}
}
new B()
.withSomething()
.withSomethingElse();
, .
javac Self Manifold.
:
, , тАж ?
public class User {
public static class Builder {
String firstName;
String lastName;
void firstName(String value) {
this.firstName = value;
}
void lastName(String value) {
this.lastName = value;
}
public User build() {
return new User(firstName, lastName);
}
}
}
public class RussianUser extends User {
public static class Builder extends User.Builder {
String patronymic;
public void patronymic(String patronymic) {
this.patronymic = patronymic;
}
public RussianUser build() {
return new RussianUser(firstName, lastName, patronymic);
}
}
}
RussianUser.Builder b = RussianUser.builder();
b.firstName("Sergei");
b.patronymic("Valeryevich");
b.lastName("Egorov");
RussianUser user = b.build();
┬л , , Java┬╗ тАФ .
, тАж ?
, , ? !
:
public class User {
public static class Builder {
public Builder() {
this.configure();
}
protected void configure() {}
:
RussianUser user = new RussianUser.Builder() {
@Override
protected void configure() {
firstName("Sergei"); // User.Builder
patronymic("Valeryevich"); // RussianUser.Builder
lastName("Egorov"); // User.Builder
}
}.build();
, .
┬л┬╗ Java: .
RussianUser user = new RussianUser.Builder() {{
firstName("Sergei");
patronymic("Valeryevich");
lastName("Egorov");
}}.build();
, . Swing/Vaadin ;)
(, , ). . , , , , :
- Java .
- JVM-.
- .
- , .
, Java self typing, Java ( JVM-).
, . , .
, !
P.S. .
. Pivotal Project Reactor, JPoint (5-6 ) тАФ Reactor, !