web-dev-qa-db-fra.com

Construire un objet à partir d'un existant en utilisant lombok

Disons que j'ai une classe annotée lombok comme

@Builder
class Band {
   String name;
   String type;
}

Je sais que je peux faire:

Band rollingStones = Band.builder().name("Rolling Stones").type("Rock Band").build();

Existe-t-il un moyen simple de créer un objet de Foo en utilisant l’objet existant comme modèle et en modifiant l’une de ses propriétés?

Quelque chose comme:

Band nirvana = Band.builder(rollingStones).name("Nirvana");

Je ne trouve pas cela dans la documentation de Lombok.

55
Mustafa

Vous pouvez utiliser le paramètre toBuilder pour attribuer à vos instances une méthode toBuilder().

@Builder(toBuilder=true)
class Foo {
   int x;
   ...
}

Foo f0 = Foo.builder().build();
Foo f1 = f0.toBuilder().x(42).build();

De la documentation :

Si vous utilisez @Builder pour générer des générateurs afin de produire des instances de votre propre classe (ceci est toujours le cas, sauf si vous ajoutez @Builder à une méthode qui ne renvoie pas votre propre type), vous pouvez utiliser @Builder (toBuilder = true) pour générer également une méthode d'instance de votre classe appelée toBuilder (); il crée un nouveau générateur qui commence avec toutes les valeurs de cette instance.

Disclaimer: Je suis un développeur Lombok.

116
Roel Spilker

Existe-t-il un moyen simple de créer un objet de Foo en utilisant l’objet existant comme modèle et en modifiant n de ses propriétés? ( l'emphase mine )

Si vous voulez vraiment changer une seule propriété, il existe un moyen plus agréable et plus efficace:

@Wither
class Band {
   String name;
   String type;
}

Band nirvana = rollingStones.withName("Nirvana");

La flétrissure ne crée pas d'ordures, mais elle ne peut changer qu'un seul champ. Pour changer de nombreux champs, vous pouvez utiliser

withA(a).withB(b).withC(c)....

et produire des tonnes de déchets (tous les résultats intermédiaires) mais que toBuilder est plus efficace et plus naturel.

24
maaartinus