Ich möchte heute das Builder Pattern vorstellen. Dieses Pattern erleichtert das Erzeugen von Objekten mit einer Vielzahl von Variablen. Anstatt für verschiedene gesetzte Variablen unterschiedliche Konstruktoren mit einer großen Menge an Parametern zu schreiben nutzt man den Ansatz der Verkettung. Mittels einer statischen inneren Klasse regelt man die Erzeugung einer Instanz der äußern Klasse.
Diese innere Klasse, der Builder, enthält Pflichtvariablen die über den Konstruktor der inneren Klasse gesetzt werden. Optionale Variablen, versehen mit Default-Werten, werden über verkettete Methodenaufrufe befüllt. Verkettet bedeutet dass die Methode jeweils das Objekt auf dem es aufgerufen wird zurückgibt. Abschließend wird die build() Methode aufgerufen. Diese returniert ein Objekt der äußeren Klasse, indem es dem Konstruktor der außeren Klasse eine Referenz auf sich selbst übergibt.
Möchte man ein unveränderliches Objekt der äußeren Klasse erzeugen, deklariert man den Konstruktor der äußeren Klasse privat und bietet keine setter Methoden. Die Variablen werden außerdem final gesetzt. Somit hat man ein immutable Objekt. Dadurch kann nur die innere Klasse, der Builder, eine Instanz des Objekts erzeugen und verändern.
public class ObjectToCreate { private final String a; private final int b; private final int c; private final String d; private final boolean e; private final int f; private ObjectToCreate(Builder builder) { // private Constructor can only be called from Builder this.a = builder.a; this.b = builder.b; this.c = builder.c; this.d = builder.d; this.e = builder.e; this.f = builder.f; } public String getA() { return a; } public int getB() { return b; } public int getC() { return c; } public String getD() { return d; } public boolean isE() { return e; } public int getF() { return f; } public static class Builder { // Pflichtfelder private final String a; private final int b; // Optional private int c = 0; private String d = "default"; private boolean e = true; private int f = 0; public Builder(String a, int b) { this.a = a; this.b = b; } public Builder c(int c) { this.c = c; return this; } public Builder d(String d) { this.d = d; return this; } public Builder e(boolean e) { this.e = e; return this; } public Builder f(int f) { this.f = f; return this; } public ObjectToCreate build() { return new ObjectToCreate(this); } } }
Das wollen wir natürlich auch noch testen
public class ObjectToCreateTest { public static void main(String... args) { ObjectToCreate.Builder builder = new ObjectToCreate.Builder("String", 1); ObjectToCreate o = builder.c(2).d("uiuiui").e(false).f(3).build(); } }
Happy building!
Schreibe einen Kommentar