Digamos que tengo una clase anotada en lombok como
@Builder
class Band {
String name;
String type;
}
Sé que puedo hacer:
Band rollingStones = Band.builder().name("Rolling Stones").type("Rock Band").build();
¿Existe una manera fácil de crear un objeto de Foo usando el objeto existente como plantilla y cambiando una de sus propiedades?
Algo como:
Band nirvana = Band.builder(rollingStones).name("Nirvana");
No puedo encontrar esto en la documentación de lombok.
@Wither
, que es más eficiente para los cambios de campo individuales:Foo f1 = f0.withX(42)
.@Wither
genera con * métodos que siempre devuelven un nuevo objeto, en lugar de establecer el campo del objeto existente. Esto es de baja eficiencia.@Wither
es mejor. Fot más de dos,toBuilder
gana. Vea mi respuesta a continuación.@Wither
no funcionará en absoluto, pero lo.toBuilder().build()
haría.Si realmente desea cambiar una sola propiedad, existe una forma más agradable y eficiente:
@With class Band { String name; String type; } Band nirvana = rollingStones.withName("Nirvana");
El marchitamiento no crea basura, pero puede cambiar solo un campo. Para cambiar muchos campos, puede usar
y producir toneladas de basura (todos resultados intermedios) pero que
toBuilder
es más eficiente y más natural.NOTA: Las versiones anteriores de lombok han utilizado la
@Wither
anotación. Consulte el comienzo de la documentación .fuente
n-1
objetos para una serie den
llamadaswithSomething
. Un objeto cuesta algo así como unos pocos bytes más 4 u 8 bytes por referencia más 1 a 8 bytes por primitiva. Entonces estamos hablando de decenas de bytes por llamada. No es gran cosa, por lo general.