Die Leute sind besorgt, die Leute machen Builder-Muster-Tools, die automatisch Java Builder-Muster generieren.

Überblick

Wie benutzt man

Die App ist wie folgt

https://riversun.github.io/java-builder/

(Ich benutze den Server nicht, da er nur mit HTML / CSS / JS erstellt wurde.)

Wie unten gezeigt, wird die Auflistung von "** Typ Variablenname **" in der Definition in ** Echtzeit ** im Code auf der rechten Seite wiedergegeben. animation.gif

Wenn Sie fertig sind, drücken Sie ** In Zwischenablage kopieren **, um den Code zu kopieren und in Ihre IDE oder Ihren Editor einzufügen.

Generiertes Codebeispiel

Im Folgenden finden Sie Beispiele zum Generieren verschiedener Builder-Muster.

Originaldaten (Definition) eingegeben

Der folgende Inhalt wurde eingegeben, um den Code zu generieren (Klassenname, Typ, Variablenname usw.).

Wenn Sie im Textbereich der Definition ** Typname ** eingeben und wie unten gezeigt mit Zeilenumbrüchen auflisten, wird der Code automatisch in Echtzeit auf der rechten Seite generiert.

package org.example
class Person
@NotNull String name
int age
String sex
List<String> hobby

Wenn Sie die Annotation ** @ </ span> NotNull ** am Anfang der Definitionszeile einfügen, ist diese Eigenschaft eine erforderliche Eigenschaft, und es wird Code generiert, um beim Erstellen auf Null zu prüfen.

Generiertes effektives Java Builder-Muster

Person.java(Wird vom Tool automatisch generiert)


package org.example;
import java.util.ArrayList;
import java.util.List;

public class Person {

  private String name;
  private int age;
  private String sex;
  private List<String> hobby;

  public static class Builder {
    
    private String name;
    private int age;
    private String sex;
    private List<String> hobby = new ArrayList<String>();

    public Builder() {    
    }
      
    Builder(String name, int age, String sex, List<String> hobby) {    
      this.name = name; 
      this.age = age; 
      this.sex = sex; 
      this.hobby = hobby;             
    }
        
    public Builder name(String name){
      this.name = name;
      return Builder.this;
    }

    public Builder age(int age){
      this.age = age;
      return Builder.this;
    }

    public Builder sex(String sex){
      this.sex = sex;
      return Builder.this;
    }

    public Builder hobby(List<String> hobby){
      this.hobby = hobby;
      return Builder.this;
    }

    public Builder addHobby(String hobby){
      this.hobby.add(hobby);
      return Builder.this;
    }

    public Person build() {
        if(this.name == null){
          throw new NullPointerException("The property \"name\" is null. "
              + "Please set the value by \"name()\". "
              + "The property \"name\" is required.");
        }

        return new Person(this);
    }
  }

  private Person(Builder builder) {
    this.name = builder.name; 
    this.age = builder.age; 
    this.sex = builder.sex; 
    this.hobby = builder.hobby;     
  }

  public void doSomething() {
      // do something
  }
}

Wenn Sie es verwenden, machen Sie es so

AppMain.java


public class AppMain {
	public static void main(String[] args) {
		new Person.Builder()
		.name("Tom")
		.age(18)
		.sex("male")
		.addHobby("programming")
		.addHobby("skiing")
		.build().doSomething();
	}
}

Generiertes GoF Builder-Muster

Das GoF Builder-Muster enthält einige weitere Zeichen und es werden mehrere Klassen generiert. Es wird auch ** AppMain.java ** generiert, was das Hauptäquivalent ist. Die Hauptbearbeitung ist ** Director.java **, die die tatsächlichen Erstellungsbedingungen bestimmt.

Person.java(Automatisch erzeugt)


package org.example;
import java.util.ArrayList;
import java.util.List;

public class Person {

  private String name;
  private int age;
  private String sex;
  private List<String> hobby = new ArrayList<String>();

  public Person() {

  }

  public Person(String name, int age, String sex, List<String> hobby) {
    this.name = name; 
    this.age = age; 
    this.sex = sex; 
    this.hobby = hobby; 
  }

  public Person setName(String name){
    this.name = name;
    return Person.this;
  }

  public String getName(){
    return this.name;
  }

  public Person setAge(int age){
    this.age = age;
    return Person.this;
  }

  public int getAge(){
    return this.age;
  }

  public Person setSex(String sex){
    this.sex = sex;
    return Person.this;
  }

  public String getSex(){
    return this.sex;
  }

  public Person setHobby(List<String> hobby){
    this.hobby = hobby;
    return Person.this;
  }

  public Person addHobby(String hobby){
    this.hobby.add(hobby);
    return Person.this;
  }

  public List<String> getHobby(){
    return this.hobby;
  }

  public void doSomething(){
    System.out.println("Person's properties");
    System.out.println("name="+name);
    System.out.println("age="+age);
    System.out.println("sex="+sex);
    System.out.println("hobby="+hobby);  
  }
}

Builder.java(Automatisch erzeugt)


package org.example;
import java.util.List;

public interface Builder {

  public void name(String name);
  public void age(int age);
  public void sex(String sex);
  public void hobby(List<String> hobby);

  Person getResult();
}

PersonBuilder.java(Automatisch erzeugt)


package org.example;
import java.util.List;

public class PersonBuilder implements Builder {
  private Person person;

  public PersonBuilder() {
    this.person = new Person();
  }

  @Override
  public void name(String name) {
    this.person.setName(name);
  }

  @Override
  public void age(int age) {
    this.person.setAge(age);
  }

  @Override
  public void sex(String sex) {
    this.person.setSex(sex);
  }

  @Override
  public void hobby(List<String> hobby) {
    this.person.setHobby(hobby);
  }


  @Override
  public Person getResult() {
  
    if(this.person.getName() == null){
      throw new NullPointerException("The property \"name\" is null. "
          + "Please set the value by \"builder.name()\" at Director class. "
          + "The property \"name\" is required.");
    }

    return this.person;
  }
}

Director.java(Automatisch erzeugt)


package org.example;

public class Director {

  private Builder builder;

  public Director(Builder builder) {
    this.builder = builder;
  }

  public void construct() {
    builder.name("something"); // required property
    builder.age(0); // optional property
    builder.sex("something"); // optional property
    //builder.hobby(new ArrayList<>());
  }
}

AppMain.java(Automatisch erzeugt)


package org.example;

public class AppMain {
  
  public static void main(String[] args) {
    
    Builder builder = new PersonBuilder();
    Director director = new Director(builder);
    director.construct();
    Person person = builder.getResult();
    person.doSomething();
    
  }
}

Generierter Teleskopkonstruktor

Ich denke nicht, dass es sich um ein ** Builder-Muster ** handelt, aber es ist ein sehr verbreitetes Muster, das beim Erstellen eines Objekts mehrere Argumente an den Konstruktor weiterleitet.

(Mit zunehmender Anzahl von Argumenten verschlechtern sich die Aussichten, sodass das ** Builder-Muster ** ins Spiel kommt.)

Person.java


package org.example;
import java.util.ArrayList;
import java.util.List;

public class Person {

  private String name;
  private int age;
  private String sex;
  private List<String> hobby = new ArrayList<String>();

  public Person() {

  }

  public Person(String name, int age, String sex, List<String> hobby) {
    this.name = name; 
    this.age = age; 
    this.sex = sex; 
    this.hobby = hobby; 
  }

  public Person setName(String name) {
    this.name = name;
    return Person.this;
  }

  public String getName() {
    return this.name;
  }

  public Person setAge(int age) {
    this.age = age;
    return Person.this;
  }

  public int getAge() {
    return this.age;
  }

  public Person setSex(String sex) {
    this.sex = sex;
    return Person.this;
  }

  public String getSex() {
    return this.sex;
  }

  public Person setHobby(List<String> hobby) {
    this.hobby = hobby;
    return Person.this;
  }

  public Person addHobby(String hobby){
    this.hobby.add(hobby);
    return Person.this;
  }

  public List<String> getHobby() {
    return this.hobby;
  }

}

Generiertes Lombok Builder-Muster

Mit diesem Tool können Sie denselben Code generieren, der automatisch generiert wird, wenn Sie Lombok mit ** @ </ span> Builder ** kommentieren.

Person.java(Automatisch erzeugt)


package org.example;
import java.util.ArrayList;
import java.util.List;

public class Person {

  private String name;
  private int age;
  private String sex;
  private List<String> hobby;

  Person(String name, int age, String sex, List<String> hobby) {
  
    if(name == null){
      throw new NullPointerException("The property \"name\" is null. "
          + "Please set the value by \"name()\". "
          + "The property \"name\" is required.");
    }

    this.name = name; 
    this.age = age; 
    this.sex = sex; 
    this.hobby = hobby; 
  }
  
  public static PersonBuilder builder(){
    return new PersonBuilder();
  }  
  public static class PersonBuilder {
    
    private String name;
    private int age;
    private String sex;
    private List<String> hobby = new ArrayList<String>();

    PersonBuilder() {    
    }
      
    public PersonBuilder name(String name){
      this.name = name;
      return PersonBuilder.this;
    }

    public PersonBuilder age(int age){
      this.age = age;
      return PersonBuilder.this;
    }

    public PersonBuilder sex(String sex){
      this.sex = sex;
      return PersonBuilder.this;
    }

    public PersonBuilder hobby(List<String> hobby){
      this.hobby = hobby;
      return PersonBuilder.this;
    }

    public PersonBuilder addHobby(String hobby){
      this.hobby.add(hobby);
      return PersonBuilder.this;
    }

    public Person build() {
      return new Person(this.name, this.age, this.sex, this.hobby);
    }
    @Override
    public String toString() {
      return "Person.PersonBuilder(name=" + this.name + ", age=" + this.age + ", sex=" + this.sex + ", hobby=" + this.hobby + ")";
    }
  }
  
  @Override
  public String toString() {
    return "Person(name=" + this.name + ", age=" + this.age + ", sex=" + this.sex + ", hobby=" + this.hobby + ")";
  }
  
  public void doSomething() {
      // do something
  }
}

Wenn Sie das Lombok Builder-Muster verwenden, gehen Sie wie folgt vor

AppMain.java


public class AppMain {
    public static void main(String[] args) {
        System.out.println(Person.builder().name("Tom").age(12).sex("male").build());
    }
}

Ausführungsergebnis

Person(name=Tom, age=12, sex=male, hobby=[])

Automatisch generierte Punktnotiz

Die folgenden Maßnahmen wurden mit dem Ziel ergriffen, eine typische Code-Ausgabe zu erstellen, mit der der generierte Code unverändert verwendet werden kann, ohne detaillierte Generierungseinstellungen vorzunehmen.

** Effektive Java-Vorlage **

** GoF-Vorlage **

--GoFs Builder-Muster ist komplizierter zu erstellen als andere, daher habe ich es dazu gebracht, "AppMain.java" (Hauptklasse) zu generieren.

  public void construct() {
    builder.name("something");
    builder.age(0);
    builder.sex("something");
    //builder.hobby(new ArrayList<>());
  }

** Teleskopkonstruktor-Vorlage **

(Es gibt noch Raum für Verbesserungen ~)

Zusammenfassung

(Bonus)

Recommended Posts

Die Leute sind besorgt, die Leute machen Builder-Muster-Tools, die automatisch Java Builder-Muster generieren.
Generieren Sie automatisch Loto 6-Kaufpläne mit Java, die Super-Anfänger gelernt haben