Vorteil der Verwendung der statischen inneren Builder-Klasse

9

Während des Schreibens der Code-Richtlinien für ein Unternehmen empfahl ich , anstelle von Teleskopkonstruktoren das Builder-Muster von Effective Java zu verwenden.

Wenn Sie jedoch etwas genauer darüber nachdenken, ist es sicherlich eine elegantere Lösung, nur die Builder-Klasse und die zusätzlichen Konstruktoren mit optionalen Argumenten zu entfernen.

Haben Sie also nur den einen Konstruktor mit den erforderlichen Parametern, normalen Gettern / Setzern und kommentieren Sie den Code. Erstellen Sie bei der Implementierung einfach eine neue Instanz Ihres Objekts und legen Sie die Werte fest.

Mein ursprünglicher Gedanke war, dass der Vorteil darin bestand, die Verwirrung darüber zu beseitigen, welche Parameter optional waren und welche erforderlich waren. Der wahre Vorteil liegt jedoch in der Verwendung von Methodenverkettung / fließender Schnittstelle.

Das Builder-Muster hat Vorteile, wenn Sie viele neue Instanzen erstellen, da die Idee die Beinarbeit erledigen kann und wenn es viele (15+) optionale Parameter gibt. Lohnt es sich jedoch, die statische innere Klasse zusätzlich zu codieren? Würden Sie die Verwendung des Builders empfehlen oder ist dies Zeitverschwendung?

NimChimpsky
quelle

Antworten:

8

Ich neige dazu, einem Muster zu folgen, dass Konstruktoren alle obligatorischen Werte bereitstellen sollten, die zum Erstellen eines gültigen und konsistenten Objekts erforderlich sind . Bei optionalen Werten versuche ich zu überlegen, welche Standardeinstellung am häufigsten verwendet werden soll, damit Setter so wenig wie möglich verwendet werden.

Wenn ich feststelle, dass es viele optionale Werte gibt oder dass ein größerer Teil der optionalen Werte tendenziell von ihren Standardeinstellungen abweicht, verwende ich das Builder-Muster (statischer innerer Builder oder ein ähnliches Design).

Josh gibt im Allgemeinen verdammt gute Ratschläge - das Beste, was ich an ihm mag, ist, dass der Rat aus den Gräben kommt - er gibt zu, dass er Fehler beim Entwerfen von Teilen von Java gemacht hat, und Effective Java ist teilweise eine Art seiner "Heilung" sprechen :-)

Martijn Verburg
quelle
1
Dies sagt nichts darüber aus, warum das Innere statisch sein sollte ...
Jimmy Hoffa
Unveränderlichkeit und Nebenwirkungen sind ebenfalls ein Ziel.
Martijn Verburg
6

Das Builder-Muster von Josh Bloch bietet ähnlich wie das GoF-Builder-Muster die Möglichkeit, ein unveränderliches Objekt mit vielen Standarddaten ohne lange Listen verketteter Konstruktoren zu erstellen.

Wenn Sie "den einen Konstruktor mit den erforderlichen Parametern haben, normale Getter / Setter", ist Ihr Objekt nicht mehr unveränderlich. dh. Sie können es lange nach dem Instanziieren ändern.

Wenn dies für Sie kein Problem ist, haben Sie das Builder-Muster überhaupt nicht benötigt. Wenn es sich um ein Problem handelt, ist Ihre Lösung fehlerhaft.

pdr
quelle
Ich glaube nicht, dass das Builder-Muster etwas mit Veränderlichkeit zu tun hat, selbst das Gof-Beispiel im Wiki ist veränderlich ... en.wikipedia.org/wiki/Builder_pattern#Java Das Muster hat auch Vorteile, die ich in der Frage skizziert habe.
NimChimpsky
3
@NimChimpsky: Ob das Builder-Muster zum Erstellen eines veränderlichen Objekts angewendet werden kann, ist nicht umstritten. Die Frage ist, sollten Sie? Getter und Setter gibt es schon seit Ewigkeiten, wo Objekte veränderlich sein können. Sie sind eine absolut solide Lösung, aber die Leute stießen auf ein häufiges Problem bei der Erstellung unveränderlicher Objekte: nicht verwaltbare Konstruktorketten. Der Builder war eine gängige Lösung und wurde so zu einem Muster, um die Kommunikation zu erleichtern.
pdr