<?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%3AObjekt-Erzeugung</id>
	<title>Builder:Objekt-Erzeugung - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://mletkin.net/index.php?action=history&amp;feed=atom&amp;title=Builder%3AObjekt-Erzeugung"/>
	<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Builder:Objekt-Erzeugung&amp;action=history"/>
	<updated>2026-05-06T17:40:25Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in MimiPedia</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>https://mletkin.net/index.php?title=Builder:Objekt-Erzeugung&amp;diff=206&amp;oldid=prev</id>
		<title>Ullrich: Die Seite wurde neu angelegt: „Kategorie:Java Kategorie:Builder =Objekt-Erzeugung=  Wann soll das Objekt -- das der Builder bauen soll -- erzeugt werden? Auf diese Frage giebt es zwei Antworten: &quot;Up front&quot; oder &quot;in time&quot;. Für beide Varianten giebt es Argumente, welche man wählt hängt von den Umständen ab. Betrachten wir also beide...  ==Up font== Was so viel heißt: Wir erzeugen das Objekt und füllen die Daten direkt hinein. Die Erzeugung findet entweder bei der Deklaratio…“</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Builder:Objekt-Erzeugung&amp;diff=206&amp;oldid=prev"/>
		<updated>2025-02-24T16:09:57Z</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; =Objekt-Erzeugung=  Wann soll das Objekt -- das der Builder bauen soll -- erzeugt werden? Auf diese Frage giebt es zwei Antworten: &amp;quot;Up front&amp;quot; oder &amp;quot;in time&amp;quot;. Für beide Varianten giebt es Argumente, welche man wählt hängt von den Umständen ab. Betrachten wir also beide...  ==Up font== Was so viel heißt: Wir erzeugen das Objekt und füllen die Daten direkt hinein. Die Erzeugung findet entweder bei der Deklaratio…“&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;
=Objekt-Erzeugung=&lt;br /&gt;
&lt;br /&gt;
Wann soll das Objekt -- das der Builder bauen soll -- erzeugt werden? Auf diese Frage giebt es&lt;br /&gt;
zwei Antworten: &amp;quot;Up front&amp;quot; oder &amp;quot;in time&amp;quot;. Für beide Varianten giebt es Argumente, welche man wählt&lt;br /&gt;
hängt von den Umständen ab. Betrachten wir also beide...&lt;br /&gt;
&lt;br /&gt;
==Up font==&lt;br /&gt;
Was so viel heißt: Wir erzeugen das Objekt und füllen die Daten direkt hinein.&lt;br /&gt;
Die Erzeugung findet entweder bei der Deklaration des entsprechenden Feldes statt&lt;br /&gt;
oder im Konstruktor des Builders. Zu bevorzugen ist der erste Fall, das kann &lt;br /&gt;
zum Beispiel so aussehen:&lt;br /&gt;
{{java|code=&lt;br /&gt;
 Foo foo == new Foo();&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;
Das Objekt das der Builder erzeugt wird erzeugt und von den with-Methoden direkt befüllt.&lt;br /&gt;
Der Vorteil ist ein sehr geringer Overhead, weil kein Zwischenspeicher für gesetzte Werte&lt;br /&gt;
benötigt wird. Die build-Methode kann das Objekt ohne weitere Aktionen ausliefern.&lt;br /&gt;
Wenn es darum geht, Entities zu erzeugen und zu befüllen ist das normalerweise das Mittel der Wahl.&lt;br /&gt;
&lt;br /&gt;
==in time==&lt;br /&gt;
Die Alternative ist, das Objekt erst dann zu erzeugen, wenn es tatsächlich benötigt wird,&lt;br /&gt;
in der Regel geschieht das dann in der build-Methode. Der offensichtliche Nachteil ist,&lt;br /&gt;
daß die with-Methoden ihre Daten nicht direkt in das zu erzeugende Objekt füllen können.&lt;br /&gt;
Es wird ein Buffer -- üblicherweise in Form von Builder-Feldern benötigt:&lt;br /&gt;
{{java|code=&lt;br /&gt;
 private String name;&lt;br /&gt;
 FooBuilder withName(String name) {&lt;br /&gt;
    this.name = name;&lt;br /&gt;
    return this;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 Foo build() {&lt;br /&gt;
    Foo foo = new Foo();&lt;br /&gt;
    foo.setName(this.name);&lt;br /&gt;
    return foo;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==Wann was?==&lt;br /&gt;
Wie man sieht ist der Aufwand bei der verzögerten Erzeugung spürbar höher als bei der Befüllung des sofort erzeugten Objekt.&lt;br /&gt;
Warum sollte man sich das antun? Man wird sich für die vergögerte Variante in der Regel nur dann entscheiden, wenn es gute&lt;br /&gt;
Gründe für die verzögerte Objekt-Erzeugung giebt. Wenn man etwa das Objekt nur dann anlegen möchte, wenn tatsächlich alle Daten&lt;br /&gt;
vorhanden sind bzw. alle Daten korrekt sind. Oder wenn die Erzeugung des Objektes besonders teuer ist.&lt;br /&gt;
&lt;br /&gt;
Und es giebt einen Fall, in dem es gar nicht anders geht. Nämlich wenn das zu erzeugende Objekt die&lt;br /&gt;
Daten -- oder zumindest einige der Daten -- im Konstruktor verlangt. Diese Variante wird im nächsten Abschnitt beschrieben.&lt;br /&gt;
&lt;br /&gt;
Einen wichtigen Punkt muß man dabei unbedingt berücksichtigen.&lt;br /&gt;
Wird das Objekt sofort erzeugt und von der Abschlußmethode des Builders geliefert, verändert jeder nachfolgende Aufruf&lt;br /&gt;
einer with-Methode des Builders dazu, daß das eben erzeugte Objekt nachträglich verändert wird!&lt;br /&gt;
&lt;br /&gt;
Die verzögerte Erzeugung kann verwendet werden, wenn der Builder als (Massen-)Factory verwendet werden soll.&lt;br /&gt;
Man konfiguriert damit ein Objekt, erzeugt es, verwendet die Konfiguration als Grundlage für das nächste Objekt&lt;br /&gt;
und so fort. &lt;br /&gt;
&lt;br /&gt;
==der Fall des ekelhaften Konstrukturs==&lt;br /&gt;
Ein formidables Beispiel liefert uns freundlicherweise der JDK. Es handelt sich um die Klasse NewCookie.&lt;br /&gt;
Der schlimmste Konstruktur -- es giebt im JDK 1.7 sieben Stück davon -- könnte im Aufruf so aussehen:&lt;br /&gt;
{{java|code=&lt;br /&gt;
 cookie = NewCookie(&amp;quot;myCookie&amp;quot;, null, null, 4711, &amp;quot;unused&amp;quot;, 10, null, true, true);&lt;br /&gt;
}}&lt;br /&gt;
Das ist so lesbar wie ansprechend... In diesem Falle bekommt der Builder für jeden Parameter ein Feld&lt;br /&gt;
und eine with-Methode. Erst in der build-Methode erzeugt man den Cookie mit den Werten der Builder-Felder.&lt;br /&gt;
Auf diese Weise werden im Builder-Aufruf nur die erforderlichen Werte gesetzt, die übrigen ggf. mit&lt;br /&gt;
default-Werten vorbelegt und der Benutzer braucht nicht nach dem passenden Konstruktor suchen.&lt;br /&gt;
&lt;br /&gt;
In diesem Falle ist es natürlich auch sinnvoll, in der build-Methode zu prüfen, ob alles da ist was benötigt wird.&lt;/div&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
</feed>