Der Einfachheit halber werde ich die Anmerkungen lombok'a verwenden:
@Value
@Builder
Nach ein wenig googeln erhalten wir diesen Builder - Trennt die Konstruktion eines komplexen Objekts von seiner Darstellung, sodass als Ergebnis desselben Konstruktionsprozesses unterschiedliche Ansichten erhalten werden können. Ist es nur für komplexe Objekte?
Schauen wir uns ein einfaches Beispiel an:
@Value
public class Info {
@Nullable String uuid;
@Nullable String email;
@Nullable String phone;
}
Eine ganz einfache Klasse. Tatsächlich erhalten wir ein unveränderliches Objekt, das über den Konstruktor initialisiert wird.
Wie wir jedoch sehen können, sind alle Felder nullbar, und das Erstellen solcher Objekte sieht nicht besonders gut aus:
final Info info1 = new Info(null, "email@email.com", "79998888888");
final Info info2 = new Info("3d107928-d225-11ea-87d0-0242ac130003", null, null);
final Info info3 = new Info("3d107928-d225-11ea-87d0-0242ac130003 ", "email@email.com", null);
...
Es gibt sicherlich Optionen:
- Objekte mit wenigen Feldern unterschiedlichen Typs können mit mehreren Konstruktoren geliefert werden. Aber das löst das Problem der obigen Klasse nicht.
- Die Verwendung von Setzern ist subjektiv und überfrachtet den Code.
Was ist mit dem Erbauer?
@Value
@Builder
public class Info {
@Nullable String uuid;
@Nullable String email;
@Nullable String phone;
}
Wir erhalten eine sehr elegante Konstruktion eines einfachen Objekts:
final Info info1 = Info.builder()
.uuid("3d107928-d225-11ea-87d0-0242ac130003")
.phone("79998888888")
.build();
final Info2 info2 = Info.builder()
.email("email@email.com")
.phone("79998888888")
.build();
...
}
Um Jackson im Projekt zu verwenden, muss unsere Klasse hinzugefügt werden, damit sie erfolgreich deserialisiert wird:
@Value
@Builder(builderClassName = "InfoBuilder")
@JsonDeserialize(builder = Info.InfoBuilder.class)
public class Info {
@Nullable String uuid;
@Nullable String email;
@Nullable String phone;
@JsonPOJOBuilder(withPrefix = "")
public static class InfoBuilder {
}
}
Wir bekommen unsere Vor- und Nachteile für beide Ansätze:
Builder:
+
1. Der Code wird prägnanter.
3. null in Konstruktorparametern ist nicht auffällig.
2. Geringere Wahrscheinlichkeit, dass Parameter des gleichen Typs verwechselt werden.
-
1. Wir erstellen ein zusätzliches Objekt, das der GC als Ganzes sicher entfernen wird, aber wir sollten es nicht vergessen.
2. Verwenden Sie bei Bedarf Jackson - stapeln Sie die Klasse.
Konstruktor:
+
1. Stapelt unsere Klasse minimal auf, kein Wasser.
2. Keine unnötige Objekterstellung.
-
1. Sehr oft kommt null im Konstruktor eines solchen Objekts an.
2. Es ist möglich, einen Fehler zu machen, wenn jemand den Code ändert.
Ergebnis
Aufgrund meiner Erfahrung tendiere ich dazu, Bauherren zu verwenden. Die Kosten sind nicht hoch, aber die Ausgabe ist ein Code, der angenehm zu lesen ist. Schreiben Sie
natürlich Tests , um den zweiten negativen Punkt bei der Verwendung von Konstruktoren zu vermeiden.
PS Dies ist mein erster Artikel, ich werde für konstruktive Kritik und Kommentare dankbar sein.