Nehmen wir an, ich habe eine mit Lombok kommentierte Klasse wie
@Builder
class Band {
String name;
String type;
}
Ich weiß, dass ich tun kann:
Band rollingStones = Band.builder().name("Rolling Stones").type("Rock Band").build();
Gibt es eine einfache Möglichkeit, ein Objekt von Foo zu erstellen, indem das vorhandene Objekt als Vorlage verwendet und eine seiner Eigenschaften geändert wird?
Etwas wie:
Band nirvana = Band.builder(rollingStones).name("Nirvana");
Ich kann das nicht in der Lombok-Dokumentation finden.
@Wither
, was für einzelne Feldänderungen effizienter ist :Foo f1 = f0.withX(42)
.@Wither
generiert meiner Meinung nach mit * Methoden, die immer ein neues Objekt zurückgeben, anstatt das Feld des vorhandenen Objekts festzulegen . Dies ist von geringer Effizienz.@Wither
ist am besten. Fot mehr als zwei,toBuilder
gewinnt. Siehe meine Antwort unten.@Wither
funktioniert das überhaupt nicht,.toBuilder().build()
würde es aber tun.Wenn Sie wirklich eine einzelne Eigenschaft ändern möchten, gibt es einen schöneren und effizienteren Weg:
@With class Band { String name; String type; } Band nirvana = rollingStones.withName("Nirvana");
Der Widerrist erzeugt keinen Müll, kann aber nur ein einziges Feld ändern. Zum Ändern vieler Felder können Sie verwenden
und produzieren Tonnen Müll (alle Zwischenergebnisse), aber dann
toBuilder
ist effizienter und natürlicher.HINWEIS: Ältere Versionen von Lombok haben
@Wither
Anmerkungen verwendet. Siehe Anfang der Dokumentation .quelle
n-1
Objekte für eine Reihe vonn
Anrufen anwithSomething
. Ein Objekt kostet ungefähr ein paar Bytes plus 4 oder 8 Bytes pro Referenz plus 1 bis 8 Bytes pro Grundelement. Wir sprechen also von zehn Bytes pro Anruf. Normalerweise keine große Sache.