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.
Wenn Sie fertig sind, drücken Sie ** In Zwischenablage kopieren **, um den Code zu kopieren und in Ihre IDE oder Ihren Editor einzufügen.
Im Folgenden finden Sie Beispiele zum Generieren verschiedener Builder-Muster.
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.
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();
}
}
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();
}
}
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;
}
}
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=[])
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.
List <String> Hobby;
Initialisierung mit new ArrayList ();
und wie addHobby (String hobby)
Ich habe auch eine Methode erstellt, mit der Sie Elemente einzeln hinzufügen können.--GoFs Builder-Muster ist komplizierter zu erstellen als andere, daher habe ich es dazu gebracht, "AppMain.java" (Hauptklasse) zu generieren.
construct
von Director.java ** generiert. public void construct() {
builder.name("something");
builder.age(0);
builder.sex("something");
//builder.hobby(new ArrayList<>());
}
(Es gibt noch Raum für Verbesserungen ~)