Kotlin Builder-Muster vereinfacht

Aug 05, 2020


Untersuchen wir die Lösung des Builder-Musters, eines der kreativen Entwurfsmuster, und wie Kotlin seine Erstellung vereinfacht.

Die Absicht des Builder-Entwurfsmusters ist es, die Konstruktion eines komplexen Objekts von seiner Darstellung zu trennen. Es ist eines der Gang-of-Four-Entwurfsmuster. Punkt 2 in Effective Java beschreibt, wie dieses Entwurfsmuster in Java effektiv eingesetzt werden kann. Ich zitiere Joshua Bloch:

"Verwenden Sie BUILDERS, wenn Sie mit vielen Konstruktoren konfrontiert sind"

Lassen Sie uns ein Beispiel sehen, in dem ich mehrere Konstruktoren hinzufüge, nur um einen Punkt zu beweisen, und gehen Sie zu dem schönen Code über:

public class Programmer { private final String name; private final int age; private final int favoriteNumber; private final String favoriteColor; private final boolean dislikesJS; }
public static class Builder { // Erforderliche Parameter private final String name; private final int age; // Optionale Parameter - initialisiert mit Standardwerten private int favoriteNumber = 0; private String favoriteColor = ""; private boolean dislikesJS = true; public Builder(String name, int age) { this.name \= name; this.age \= age; } public Builder favoriteNumber(int val) { favoriteNumber \= val; return this; } public Builder favoriteColor(String val) { favoriteColor \= val; return this; } public Programmer build() { return new Programmer(this); }
private Programmer(Builder builder) { name = builder.name; age = builder.age; favoriteNumber = builder.favoriteNumber; favoriteColor = builder.favoriteColor; dislikesJS = builder.dislikesJS; }

So instanziieren wir ihn:

final Programmer programmer = new Builder("John", 30) .favoriteNumber(1729) .favoriteColor("Blue") .build();

Sieht richtig und vor allem nett und ordentlich aus. Aber...

In Kotlin braucht man gar kein Builder-Pattern zu verwenden, weil es das Feature der Default-Parameter gibt, mit denen man für jedes optionale Konstruktor-Argument Default-Werte definieren kann.

Aber was ist mit der Funktion des Builder-Musters, benannte optionale Parameter wie in Python zu simulieren, sagst du?

Hm... zunächst einmal, warum unterbrechen Sie mich und wer sind Sie? Eigentlich wollte ich gerade dazu kommen... ლ(ಠ_ಠ ლ)

Nun, in Kotlin brauchen wir benannte optionale Parameter nicht zu simulieren, weil wir sie direkt verwenden können.

class Programmer( private val name: String, private val age: Int, private val favoriteNumber: Int = 0, private val favoriteColor: String = "", private val dislikesJS: Boolean = true )

Das Erstellen eines Objekts in Kotlin sieht dann wie folgt aus:

val programmer = Programmer(Name = "John", Alter = 30, favoriteNumber = 1729, favoriteColor = "Blue")

Zur besseren Lesbarkeit können Sie die benötigten Parameter auch benennen.

Wie in Java ist das hier erstellte Objekt unveränderlich. Wir haben die benötigten Codezeilen von 2871 in Java auf 2 in Kotlin reduziert, was zu einer enormen Produktivitätssteigerung führt.

Hinweis* Standard-Parameter sind etwas, das Java nicht kennt, und wenn wir Java-freundlichen Code schreiben wollen, können wir einfach @JvmOverloads zum Konstruktor hinzufügen und eines der größten Verkaufsargumente von Kotlin nutzen: 100%ige Interoperabilität mit Java.

class Programmer @JvmOverloads constructor( private val name: String, private val age: Int, private val favoriteNumber: Int = 0, private val favoriteColor: String = "", private val dislikesJS: Boolean = true )
Tanja Zlatanovska

Tanja Zlatanovska

Buchen Sie eine kostenlose Beratung

Wählen Sie Ihre Branche*

Bitte wählen Sie Ihre Branche*

Wählen Sie Ihren Servicetyp

Bitte wählen Sie Ihren Servicetyp

calendarWann passt es Ihnen am besten für ein kurzes Gespräch

Die mit * gekennzeichneten Felder sind Pflichtfelder

Alle Beiträge anzeigen