157 votes

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.

339voto

Roel Spilker Points 2807

Vous pouvez utiliser l' toBuilder paramètre à donner votre cas, un toBuilder() méthode.

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

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

À partir de la documentation:

Si vous utilisez @Builder pour générer les constructeurs à produire des instances de la même classe (ce qui est toujours le cas sauf si l'ajout de @Générateur à une méthode qui ne retourne pas de votre propre type), vous pouvez utiliser @Builder(toBuilder = true) pour génèrent également une méthode d'instance de votre classe appelée toBuilder(); il crée un nouveau constructeur qui débute avec toutes les valeurs de cette instance.

Disclaimer: je suis un lombok développeur.

55voto

maaartinus Points 12510

Est-il un moyen facile de créer un objet de Foo à l'aide de l'objet existant comme modèle et en changeant l'une de ses propriétés? (c'est moi qui souligne)

Si vous voulez vraiment changer une seule propriété, alors il y a de plus agréable et plus efficace:

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

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

Le wither crée pas de déchets, mais il peut changer un seul champ. Pour changer de nombreux domaines, vous pouvez utiliser

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

et de produire des tonnes de déchets (tous les résultats intermédiaires), mais qu' toBuilder est plus efficace et plus naturelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X