рдмрд┐рд▓реНрдбрд░реНрд╕ рдмрдирд╛рдо рдЬрд╛рд╡рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕

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


рдпрд╣ рд╕рд░рд▓ рд╣реИ, рдпрд╣ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓реЛрдореНрдмреЛрдХ рдпрд╛ рдЗрдореНрдпреВрдЯреЗрдмрд▓реНрд╕ рдореЗрдВ @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();

:


  1. User тАФ , .
  2. , User .
  3. Builder , User .
  4. 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") //  User.Builder :(
    .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() //  ! User   RussianUser
    ;

: 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") //  RussianUser.Builder :)
    .patronymic("Valeryevich") // RussianUser.Builder
    .lastName("Egorov") // RussianUser.Builder
    .build(); // RussianUser

:


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() //    void
    .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(); // RussianUser

┬л , , 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 ;)


(, , ). . , , , , :


  1. Java .
  2. JVM-.
  3. .
  4. , .


, Java self typing, Java ( JVM-).


, . , .


, !


P.S. .


. Pivotal Project Reactor, JPoint (5-6 ) тАФ Reactor, !

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


All Articles