<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://mletkin.net/index.php?action=history&amp;feed=atom&amp;title=Builder%3AKomponenten</id>
	<title>Builder:Komponenten - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://mletkin.net/index.php?action=history&amp;feed=atom&amp;title=Builder%3AKomponenten"/>
	<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Builder:Komponenten&amp;action=history"/>
	<updated>2026-06-10T04:10:11Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in MimiPedia</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>https://mletkin.net/index.php?title=Builder:Komponenten&amp;diff=203&amp;oldid=prev</id>
		<title>Ullrich: Die Seite wurde neu angelegt: „Kategorie:Java Kategorie:Builder =Komponenten= Die Anwendung eines Buildes im Code erfolgt stets in drei Schritten, auch wenn diese nicht immer unmittelbar hintereinander ausgeführt werden müssen: #Erzeugen des Builders #Konfiguration oder Manipulation des vom Builder zu erzeugenden Objektes #Herausgabe des gewünschten Objekts Auch wenn es Variationen darüber giebt was die einzelnen Methoden des Builders tatsächlich tun, giebt es zu jeder der…“</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Builder:Komponenten&amp;diff=203&amp;oldid=prev"/>
		<updated>2025-02-24T16:07:31Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „&lt;a href=&quot;/index.php?title=Kategorie:Java&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Kategorie:Java (Seite nicht vorhanden)&quot;&gt;Kategorie:Java&lt;/a&gt; &lt;a href=&quot;/index.php?title=Kategorie:Builder&quot; title=&quot;Kategorie:Builder&quot;&gt;Kategorie:Builder&lt;/a&gt; =Komponenten= Die Anwendung eines Buildes im Code erfolgt stets in drei Schritten, auch wenn diese nicht immer unmittelbar hintereinander ausgeführt werden müssen: #Erzeugen des Builders #Konfiguration oder Manipulation des vom Builder zu erzeugenden Objektes #Herausgabe des gewünschten Objekts Auch wenn es Variationen darüber giebt was die einzelnen Methoden des Builders tatsächlich tun, giebt es zu jeder der…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Builder]]&lt;br /&gt;
=Komponenten=&lt;br /&gt;
Die Anwendung eines Buildes im Code erfolgt stets in drei Schritten, auch wenn diese nicht&lt;br /&gt;
immer unmittelbar hintereinander ausgeführt werden müssen:&lt;br /&gt;
#Erzeugen des Builders&lt;br /&gt;
#Konfiguration oder Manipulation des vom Builder zu erzeugenden Objektes&lt;br /&gt;
#Herausgabe des gewünschten Objekts&lt;br /&gt;
Auch wenn es Variationen darüber giebt was die einzelnen Methoden des Builders tatsächlich tun,&lt;br /&gt;
giebt es zu jeder der genannten Schritte auch eine Gruppe von Methoden die zur Ausführung des Schrittes&lt;br /&gt;
beitragen. Wir haben damit drei Gruppen von Methoden:&lt;br /&gt;
&lt;br /&gt;
#Creator-Methoden zur Erzeugung&lt;br /&gt;
#Modifier-Methoden zur Manipulation&lt;br /&gt;
#Generator-Methoden zur Auslieferung des Ergebnisses&lt;br /&gt;
&lt;br /&gt;
Während man oft nur eine Erzeugungs- und in der Regel nur eine Methode zur Auslieferung des Objekts benötigt,&lt;br /&gt;
hat man üblicherweise einige oder viele Konfigurations-Methoden. Der Begriff &amp;quot;Generator&amp;quot;-Methode ist dabei diskutabel,&lt;br /&gt;
weil das Objekt nicht notwendigerweise in der &amp;quot;Generator&amp;quot;-Methode erzeugt werden muß.&lt;br /&gt;
&lt;br /&gt;
==Builder erzeugen mit dem Creator==&lt;br /&gt;
Um mit einem Builder arbeiten zu können, muß man zunächst ein passendes Objekt erzeugen.&lt;br /&gt;
Dazu hat man in Java zwei Möglichkeiten: Mit einem passenden Konstruktor einerseits oder einer (in der Regel statischen)&lt;br /&gt;
Factory Methode -- die natürlich ihrerseits einen Konstruktor aufruft -- andererseits.&lt;br /&gt;
&lt;br /&gt;
Offensichtlich braucht man in jedem Fall einen Konstruktor, es geht also eher um die Frage ob man&lt;br /&gt;
diesen Konstruktor direkt oder über eine geeignete Methode zugänglich macht.&lt;br /&gt;
&lt;br /&gt;
===Konstruktor===&lt;br /&gt;
Die Konstruktor-Variante liegt den meisten Entwicklern wohl am nächsten.&lt;br /&gt;
Dabei wird für jede Art der Erzeugung ein Konstruktor definiert -- maximal einen ohne und beliebig viele mit Parametern.&lt;br /&gt;
Da die Befüllung in der Regel über Modifier-Methoden geschieht, steuert man mit den Konstruktor-Parametern&lt;br /&gt;
seltener die Erzeugung des Builders selbst, oftmals aber die Initial-Befüllung.&lt;br /&gt;
&lt;br /&gt;
Ein naheligendes Beispiel ist die Implementierung eines Konstruktors für die Erzeugung neuer Generate&lt;br /&gt;
und eines Konstruktors zur Manipulation existierender Generate:&lt;br /&gt;
{{java|code=&lt;br /&gt;
public class PersonBuilder {&lt;br /&gt;
   private Person person;&lt;br /&gt;
   public PersonBuilder() {&lt;br /&gt;
      person = new Person();&lt;br /&gt;
   }&lt;br /&gt;
   public PersonBuilder(Person person) {&lt;br /&gt;
      this.person = person;&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Man kann dem Konstruktor auch Werte zur Initial-Belegung mitgeben:&lt;br /&gt;
{{java|code=&lt;br /&gt;
public class AmpelBuilder {&lt;br /&gt;
  private Ampel ampel = new Ampel();&lt;br /&gt;
  public AmpelBuilder(Color initial) {&lt;br /&gt;
     ampel.farbe = initial;&lt;br /&gt;
  }&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Von dem Konzept, im Konstruktor &amp;#039;&amp;#039;alle&amp;#039;&amp;#039; nicht-optionalen Werte zu setzen wird an dieser Stelle allerdings abgeraten.&lt;br /&gt;
Einerseits bietet es eine gewisse statische Sicherheit, führt aber in der Praxis zu immer häßlicheneren Konstruktoren.&lt;br /&gt;
Besser lesbar ist immer die Variante, die Konsistenz des Generats -- oder die Möglichkeit der Erzeugung -- in&lt;br /&gt;
der Generator-Methode zu prüfen.&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von Konstruktoren findet ihre Grenze da, wo sich die Konstruktoren nicht mehr anhand der Typen&lt;br /&gt;
ihrer Parameter-Liste unterscheiden lassen. Das ist schlicht und ergreifend unmöglich zu implementieren.&lt;br /&gt;
&lt;br /&gt;
===Statische Methoden===&lt;br /&gt;
Der Personen-Builder des vorangegangenen Absatzes würde mit statischen Methoden so aussehen:&lt;br /&gt;
{{java|code=&lt;br /&gt;
public class PersonBuilder {&lt;br /&gt;
   private Person person;&lt;br /&gt;
&lt;br /&gt;
   public static PersonBuilder empty() {&lt;br /&gt;
      return new PersonBuilder (new Person());&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   public static PersonBuilder use(Person person) {&lt;br /&gt;
      return new PersonBuilder (person);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   private PersonBuilder(Person person) {&lt;br /&gt;
      this.person = person;&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Wir verwenden hier weiterhin den Konstruktor zur Initialisierung, machen ihn aber private und rufen ihn&lt;br /&gt;
über die statischen Methoden auf. Das macht im vorliegenden Beispiel keinen großen Unterschied, sieht nur etwas anders aus.&lt;br /&gt;
&lt;br /&gt;
Betrachten wir nochmal das Ampel-Beispiel von vorhin. Der Aufruf&lt;br /&gt;
{{java|new AmpelBuilder(Color.BLUE)}}&lt;br /&gt;
ist nun nicht besonders sinnvoll. Wollten wir das mit der Konstruktor-Lösung verhindern, blieben nicht viel&lt;br /&gt;
Möglichkeiten. Wir könnten ein Enum definieren, dort nur die Ampel-Farben zulassen und einen Konstruktor mit &lt;br /&gt;
einem entsprechenden Enum-Parameter definieren. Statische Methoden bieten eine weniger aufwändige Möglichkeit:&lt;br /&gt;
{{java|code=&lt;br /&gt;
static AmpelBuilder rot() {&lt;br /&gt;
  return new AmpelBuilder(Color.RED);&lt;br /&gt;
}&lt;br /&gt;
static AmpelBuilder gelb() {&lt;br /&gt;
  return new AmpelBuilder(Color.YELLOW);&lt;br /&gt;
}&lt;br /&gt;
static AmpelBuilder gruen() {&lt;br /&gt;
  return new AmpelBuilder(Color.GREEN);&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Der Konstruktor wird dann wieder private deklariert.&lt;br /&gt;
&lt;br /&gt;
===Wann wählt man was?===&lt;br /&gt;
Wenn man die freie Wahl hat, ist die Entscheidung tatsächlich eine Geschmacksfrage.&lt;br /&gt;
Wenn man mehr Creator-Methoden braucht als die Konstruktor-Lösung es hergiebt, giebt es eigentlich keine Wahl.&lt;br /&gt;
Es sei denn, man bevorzugt seltsame Lösungen mit Selektor-Parametern.&lt;br /&gt;
&lt;br /&gt;
Auf jeden Fall sollte man dabei aber die Parameter-Listen so kurz wie möglich halten.&lt;br /&gt;
Und generische Parameter mit Typen wie {{java|int}} oder {{java|String}} sollten bei der Erzeugung nur dann verwendet werden,&lt;br /&gt;
wenn tatsächlich &amp;#039;&amp;#039;alle&amp;#039;&amp;#039; Werte erlaubt sind. Wenn man etwa eine eMail-Adresse als String übergiebt, kann man dem Konstruktor&lt;br /&gt;
nicht ansehen welche Bedeutung der übergeben String hat. Eine statische Methode könnte {{java|forMailAddress}} heißen.&lt;br /&gt;
&lt;br /&gt;
Eine viel elegantere Lösung bietet ein eigener Datentyp &amp;quot;EmailAdresse&amp;quot;, was mithilfe von {{java|record}} sehr schlank&lt;br /&gt;
zu implementieren ist.&lt;br /&gt;
&lt;br /&gt;
==Das Generat definieren mit dem Modifier==&lt;br /&gt;
Die Modifier-Methoden versorgen dem Builder mit Daten aus denen das Generat befüllt wird.&lt;br /&gt;
Sie haben alle den selben Aufbau:&lt;br /&gt;
{{java|code=&lt;br /&gt;
Builder methode(Typ wert) {&lt;br /&gt;
   // übernehme Daten aus &amp;quot;wert&amp;quot;&lt;br /&gt;
   return this;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Die Modifier-Methoden sollten einen einzelnen Parameter haben. In Ausnahmen kann man auch&lt;br /&gt;
auf den Parameter verzichten. Mehr als einen Parameter sollte man aber nicht übergeben. Ausgenommen&lt;br /&gt;
ist die Übergabe beliebig vieler Parameter -- die vararg-Form.&lt;br /&gt;
&lt;br /&gt;
Wer unbedingt mehrere Parameter an die Modifier-Methode übergeben möchte, folge der &amp;quot;Clean Code&amp;quot;-Methode&lt;br /&gt;
und definiere ein Parameter-Objekt, das die Werte in &amp;#039;&amp;#039;einem&amp;#039;&amp;#039; Objekt zusammenfaßt. Dafür kann man sehr gut&lt;br /&gt;
einen Builder schreiben... &lt;br /&gt;
&lt;br /&gt;
===Einen Wert übernehmen===&lt;br /&gt;
Im einfachsten Fall wird ein einzelner Wert übergeben. Die Methode sollte&lt;br /&gt;
&amp;#039;&amp;#039;nicht&amp;#039;&amp;#039; {{java|setIrgendwas}} heißen, das giebt nur Verwirrung mit nicht-Builder-Klassen.&lt;br /&gt;
Empfehlenswert ist das Präfix &amp;quot;with&amp;quot;:&lt;br /&gt;
{{java|code=&lt;br /&gt;
FooBuilder withName(String name) {&lt;br /&gt;
   foo.setName(name);&lt;br /&gt;
   return this;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Der Wert wird übernommen und &amp;#039;&amp;#039;in Gänze&amp;#039;&amp;#039; in das Ergebnis-Objekt übernommen.&lt;br /&gt;
Sollen nur Teile des übergebenen Arguments verwendet werden, sollte man einen anderen Präfix&lt;br /&gt;
wählen, zum Beispiel &amp;quot;use&amp;quot; oder &amp;quot;from&amp;quot; oder entsprechende Konstrukte.&lt;br /&gt;
Hier soll nur der Name der übergebenen Person verwendet werden:&lt;br /&gt;
{{java|code=&lt;br /&gt;
FooBuilder useForName(Person person) {&lt;br /&gt;
   foo.setName(person.getName());&lt;br /&gt;
   return this;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Auf Namenskonventionen wird im Anschluß eingegangen.&lt;br /&gt;
&lt;br /&gt;
===Werte aus einem Objekt extrahieren===&lt;br /&gt;
Wenn nicht das gesamte übergebene Objekt verwendet werden soll&lt;br /&gt;
sondern nur ein Teil davon, sollte sich das in der Benamung niederschlagen.&lt;br /&gt;
&lt;br /&gt;
Soll etwa nur der Name einer person verwendet werden, kann man schreiben:&lt;br /&gt;
{{java|code=&lt;br /&gt;
public FooBuilder usePersonForName(Person person) {&lt;br /&gt;
   foo.setName(person.getName());&lt;br /&gt;
   return this;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Man kann das verwendete Objekt im Namen auch weglassen und {{java|useForName}} schreiben.&lt;br /&gt;
Werden generische Typen wie {{java|String}} oder Zahlen verwendet sollte man aber immer&lt;br /&gt;
dazuschreiben als was der Parameter übergeben wird, denn aus dem Datentyp geht es nicht hervor.&lt;br /&gt;
 &lt;br /&gt;
werden mehrere Komponenten des übergebenen Objekts verwendet kann man gegebenenfalls einfach&lt;br /&gt;
{{java|use}} schreiben. Dann muß aber aus dem Kontext bzw. im Team klar sein was da geschieht.&lt;br /&gt;
Grundsätzlich gilt: So genau wie nötig, so allgemein wie möglich.&lt;br /&gt;
===Generate anderer Builder===&lt;br /&gt;
Möchte man Objekte mit dem Builder setzen, verwendet man nicht selten Objekte die&lt;br /&gt;
andere Builder generieren. Zum Setzen der Adresse einer Person in der Klasse&lt;br /&gt;
{{java|code=&lt;br /&gt;
public class Person {&lt;br /&gt;
   Adresse adresse;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
kann man im Builder die Methode&lt;br /&gt;
{{java|code=&lt;br /&gt;
public PersonBuilder with(Adresse adresse) {&lt;br /&gt;
    person.adresse = adresse;&lt;br /&gt;
    return this;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
definieren und wie folgt aufrufen:&lt;br /&gt;
{{java|code=new PersonBuilder().with(new AdressBuilder().get());}}&lt;br /&gt;
Wenn man die Modifier-Methode mit dem Builder als Parameter-Typ definiert:&lt;br /&gt;
{{java|code=&lt;br /&gt;
public PersonBuilder with(AdressBuilder adresse) {&lt;br /&gt;
    person.adresse = adresse.get();&lt;br /&gt;
    return this;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Sieht der Aufruf so aus:&lt;br /&gt;
{{java|code=new PersonBuilder().with(new AdressBuilder());}}&lt;br /&gt;
Man spart sich immerhin den Aufruf der Generator-Methode.&lt;br /&gt;
Man schafft damit aber auch eine Möglichkeit für den einbettenden Builder, das übergeben Objekt&lt;br /&gt;
zu modifizieren. Das ist etwa dann hilfreich, wenn das eingebettete Objekt eine Referenz über&lt;br /&gt;
das einbettende Objekt haben soll (das Beispiel ist vielleicht nicht sehr sinnvoll):&lt;br /&gt;
{{java|code=&lt;br /&gt;
public PersonBuilder with(AdressBuilder adresse) {&lt;br /&gt;
   adresse.setBewohner(person);&lt;br /&gt;
   person.adresse = adresse.get();&lt;br /&gt;
   return this;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Da wir hier nur eine Referenz setzen wollen, werden wir nicht die Generator-Methode des Personen-Builder aufrufen.&lt;br /&gt;
&lt;br /&gt;
===Boolean-Werte===&lt;br /&gt;
Boolean-Parameter sind &amp;#039;&amp;#039;immer&amp;#039;&amp;#039; häßlich, weil die Bedeutung von {{java|true}} und {{java|false}}&lt;br /&gt;
nur aus dem Kontext erschlossen werden kann. Alternativ kann man hier zwei parameterlose Modifier-Methoden&lt;br /&gt;
anbieten -- eine für {{java|true}} und eine {{java|false}}. Ist der default-Wert klar,&lt;br /&gt;
kann man auch auf eine der beiden Methoden verzichten:&lt;br /&gt;
{{java|code=&lt;br /&gt;
public FooBuilder enabled() {&lt;br /&gt;
   foo.setEnabled(true);&lt;br /&gt;
   return this;&lt;br /&gt;
}&lt;br /&gt;
public FooBuilder disabled() {&lt;br /&gt;
   foo.setEnabled(false);&lt;br /&gt;
   return this;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Für einen Manipulator-Builder kann man auch eine &amp;quot;toggle&amp;quot;-Methode anbieten, die den aktuellen Wert negiert.&lt;br /&gt;
&lt;br /&gt;
===Sammlungen manipulieren===&lt;br /&gt;
Enthält das Objekt eine Sammlung von anderen Objekten, benötigt man in der Regel eine Methode zum Hinzufügen&lt;br /&gt;
einzelner Elemente. Niemals sollte man eine Collection zur Manipulation herausrücken, das bringt nur Probleme.&lt;br /&gt;
Getter- und Setter für Collections anzubieten ist so ziemlich das Dümmste was man machen kann...&lt;br /&gt;
&lt;br /&gt;
Unter Sammlung wollen wir hier jedes Konstrukt verstehen, das Objekte einer gemeinsamen Klasse zusammenfaßt.&lt;br /&gt;
Also List-, Set-, Array-, und alle anderen Collection-Objekte sowie klassische Java-arrays und selbstgebaute&lt;br /&gt;
Objekte.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich lassen sich auch Methoden für das Entfernen von Listen-Elementen definieren,&lt;br /&gt;
aber beim Zusammenbauen von Objekten braucht man das eher selten.&lt;br /&gt;
&lt;br /&gt;
Als Präfix bietet sich hier &amp;quot;add&amp;quot; ganz von selbst an :-)&lt;br /&gt;
Im folgenden Code-Schnipsel wird bei Bedarf auch die Collection selbst erzeugt.&lt;br /&gt;
In der Regel ist es besser, sie bei der Objekt-Erzeugung selbst anzulegen.&lt;br /&gt;
&lt;br /&gt;
{{java|code=&lt;br /&gt;
public FooBuilder add(Adresse adresse) {&lt;br /&gt;
   if (foo.getAdressen() == null) {&lt;br /&gt;
      foo.setAdressen(new ArrayList&amp;lt;Adressen&amp;gt;());&lt;br /&gt;
   }&lt;br /&gt;
   foo.getAdressen().add(adresse);&lt;br /&gt;
   return this;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Eine Liste von Objekten läßt sich damit so hinzufügen:&lt;br /&gt;
{{java|code=adresssListe.stream().forEach(FooBuilder::add);}}&lt;br /&gt;
&lt;br /&gt;
Bisweilen ist es aber eleganter eine Sammlung von Objekten komplett zu übergeben.&lt;br /&gt;
Der Stream ist auch hier der Parameter-Typ der Wahl, weil sich jede Sammlung ohne overhead in einen Stream&lt;br /&gt;
überführen läßt. Wir behalten in jedem Fall die {{java|add}}-Methode und fühen die Stream-Variante als convenience-Methode hinzu:&lt;br /&gt;
{{java|code=&lt;br /&gt;
public FooBuilder add(Stream&amp;lt;Adresse&amp;gt; stream) {&lt;br /&gt;
   stream.forEach(this::add);&lt;br /&gt;
   return this;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;  &lt;br /&gt;
}}&lt;br /&gt;
Eine null-Prüfung sollte man bei Sammlungen eigentlich nicht brauchen. Sammlungen sollten niemals null sein, höchstens leer.&lt;br /&gt;
Eine weitere valide Variante ist die Verwendung einer variablen Parameter-Liste. Auch sie läßt sich über einen stream&lt;br /&gt;
verarbeiten:&lt;br /&gt;
{{java|code=&lt;br /&gt;
public FooBuilder add(Adresse... adressen) {&lt;br /&gt;
   Arrays.stream(adressen).forEach(this::add);&lt;br /&gt;
   return this;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;  &lt;br /&gt;
}}&lt;br /&gt;
oder -- wenn wir die Stream-Variante ebenfalls implementiert haben:&lt;br /&gt;
{{java|code=&lt;br /&gt;
public FooBuilder add(Adresse... adressen) {&lt;br /&gt;
   add(Arrays.stream(adressen));&lt;br /&gt;
   return this;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;  &lt;br /&gt;
}}&lt;br /&gt;
Das &amp;quot;convenience-Prinzip&amp;quot; hat den Vorteil, daß man die Hinzufügung -- und mögliche zugehörige Logik -- nur &amp;#039;&amp;#039;einmal&amp;#039;&amp;#039;&lt;br /&gt;
implementieren muß. Gegebenenfalls muß man hier aber tatsächlich die Performance in Betracht ziehen. Die Abfrage ob das&lt;br /&gt;
Listen-Objekt vorhanden ist etwa sollte man nicht bei jedem add ausführen.&lt;br /&gt;
&lt;br /&gt;
zum Schluß sei noch die Variante angesprochen bei der der Inhalt der Sammlung ersetzt wird. Das kann zwar sinnvoll sein,&lt;br /&gt;
ist aber mit Vorsicht  zu genießen, weil dadurch vorangegangene Hinzufügungen Rückgängig gemacht werden. Das ist nicht&lt;br /&gt;
intuitiv und kann leicht zu Fehlern führen:&lt;br /&gt;
{{java|code=&lt;br /&gt;
public FooBuilder replace(Stream&amp;lt;Adresse&amp;gt; stream) {&lt;br /&gt;
   foo.setAdressen(stream.collect(Collectors.toList()));&lt;br /&gt;
   return this;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Namens-Konventionen===&lt;br /&gt;
Es giebt keine kanonischen Naming-Regeln, man sollte sich daher darum bemühen eine -- zumindest im Team --&lt;br /&gt;
allgemeinverständlicher Nomenklatur zu schaffen.&lt;br /&gt;
&lt;br /&gt;
Das empfohlene Namensschema in Java sieht für Methoden ein verbiales Konstrukt vor. Für Setter&lt;br /&gt;
verwendet man daher den Imperativ des Verbs &amp;quot;to set&amp;quot; mit dem Namen des Atrtributs.&lt;br /&gt;
&lt;br /&gt;
Da die Modifier-Methoden des Builders keine void-Methoden sind wie die Setter, sondern&lt;br /&gt;
die Instanz des verwendeten Builders liefern, verbietet sich &amp;quot;set&amp;quot; als Präfix.&lt;br /&gt;
&lt;br /&gt;
Eine Alternative ist die Verwendung von &amp;quot;with&amp;quot;:&lt;br /&gt;
{{java|code= public FooBuilder withName(String name);}}&lt;br /&gt;
Das bedeutet eine Abweichung vom Verb-Schema, drückt aber aus was geschieht.&lt;br /&gt;
Der Builder erhält dadurch einen eher statischen Charakter.&lt;br /&gt;
Legt der typ des übergebenen Objekt fest -- oder zumindestes nahe -- was gesetzt wird, kann man den&lt;br /&gt;
Attribut-Namen auch weglassen:&lt;br /&gt;
{{java|code=&lt;br /&gt;
FooBuilder with(StatusEnum status);&lt;br /&gt;
FooBuilder with(Person person);&lt;br /&gt;
}}&lt;br /&gt;
Hat das {{java|Foo}}-Objekt mehr als eine Person oder mehr als einen Status,&lt;br /&gt;
kann man das Attribut natürlich nicht weglassen. Die Methode hieße dann aber&lt;br /&gt;
eher {{java|withAntragsteller}} bzw. {{java|withVorherigerStatus}} oder so ähnlich.&lt;br /&gt;
&lt;br /&gt;
Hier eine kleine Auflistung möglicher Präfixe:&lt;br /&gt;
{|&lt;br /&gt;
|add||Hinzufügen von Elementen zu einer Sammlung&lt;br /&gt;
|-&lt;br /&gt;
|use||Verwendung eines Objekts zur Manipulation&lt;br /&gt;
|-&lt;br /&gt;
|from||Extraktion von Daten aus einem Objekt&lt;br /&gt;
|-&lt;br /&gt;
|for||Verwendung des Parameters für einen bestimmten Zweck&lt;br /&gt;
|}&lt;br /&gt;
Die Namenskonventionen sollten &amp;#039;&amp;#039;immer&amp;#039;&amp;#039; Gegenstand einer Team-Debatte sein.&lt;br /&gt;
&lt;br /&gt;
==Den Bau abschließen mit dem Generator==&lt;br /&gt;
Ist die Konfiguration des Objekts abgeschlossen, kann es vom Benutzer abgeholt werden.&lt;br /&gt;
Der Builder beitet dafür in der Regel eine einzige Methode an, die üblicherweise {{java|build}}&lt;br /&gt;
oder kürzer {{java|get}} heißt. Der Name sollte im Projekt einheitlich gewählt werden.&lt;br /&gt;
Wenn der Benutzer beim Aufruf der Generator-Methode entscheiden kann, welche Art Objekt er&lt;br /&gt;
haben möchte, kann der Builder auch mehr als eine Generator-Methode anbieten.&lt;br /&gt;
&lt;br /&gt;
Das Objekt wurde entweder schon früher erzeugt und von der Generator-Methode nur ausgeliefert&lt;br /&gt;
oder es wird erst beim Aufrufen der Generator-Methode erzeugt. In der Generator-Methode kann auch&lt;br /&gt;
eine Validierung durchgeführt werden. Schlägt diese fehl, sollte kein Objekt geliefert werden.&lt;br /&gt;
Dann sollte entweder eine Exception fliegen oder das Objekt in ein Ergebnis-Objekt verpackt werden.&lt;br /&gt;
&lt;br /&gt;
Streng genommen ist der raison d&amp;#039;être der Generator-Methode nicht das Erzeugen, sondern das Ausliefern.&lt;br /&gt;
Wir bleiben trotzdem beim Ausdruck &amp;quot;Generator&amp;quot;-Methode. Auch wenn es nicht immer akkurat ist, ist die&lt;br /&gt;
Vorstellung, daß die Genertor-Methode das gewünschte Objekt herstellt das vorher definiert wurde&lt;br /&gt;
ein adäquates Denk-Muster.&lt;br /&gt;
&lt;br /&gt;
===Das Objekt sichern===&lt;br /&gt;
Wenn das Objekt nicht erst in der Abschluß-Methode erzeugt wird, muß man dafür sorgen daß es&lt;br /&gt;
vom Builder nicht verändert wird. Hält der Builder weiterhin die Referenz auf das erzeugte Objekt,&lt;br /&gt;
verändert jeder Aufruf der with-Methode das erzeugte Objekt. Und ein wiederholter Aufruf der&lt;br /&gt;
Abschluß-Methode liefert &amp;#039;&amp;#039;jedesmal&amp;#039;&amp;#039; das selbe Objekt.&lt;br /&gt;
&lt;br /&gt;
Man kann im Team die Vereinbarung treffen, daß jedes Builder-Objekt nach Abholen des Objekts&lt;br /&gt;
nicht mehr verwendet wird. Das schützt aber nicht vor unbeabsichtigten Fehlern.&lt;br /&gt;
Die einfachste Sicherung sieht so aus:&lt;br /&gt;
{{java|code=&lt;br /&gt;
Foo build() {&lt;br /&gt;
   result = this.foo;&lt;br /&gt;
   this.foo = null;&lt;br /&gt;
   return result;&lt;br /&gt;
}}&lt;br /&gt;
Jeder Aufruf einer with-Methode führt nun zu einer {{java|NullpointerException}}.&lt;br /&gt;
Wenn nötig, kann man die with-Methoden nun mit einer entsprechenden Abfrage sichern um eine&lt;br /&gt;
schönere Exception zu erzeugen.&lt;/div&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
</feed>