web-dev-qa-db-fra.com

Comment implémenter la classe Lombok @Builder for Abstract

J'ai des classes qui étendent une classe abstraite et je ne veux pas mettre @Builder en plus de toutes les classes enfants.

Existe-t-il un moyen d'implémenter Lombok @Builder pour une classe abstraite?

7
sam

Pas possible du tout. Le générateur est généré dans la super classe lors de la compilation et il ne peut avoir aucune connaissance des sous-classes possibles qui finiront par l'implémenter.

Par exemple, la sous-classe peut avoir des constructeurs qui doivent être utilisés pour que l'instance ait un état valide et Lombok ne peut pas en avoir connaissance lorsque le générateur est généré.

Jetez un œil à l'exemple de code dans la documentation @Builder. Vous verrez rapidement qu'il est tout simplement impossible de l'adapter pour instancier une sous-classe inconnue.

2
Torben

Ceci est possible avec lombok 1.18.2 (et supérieur) en utilisant la nouvelle annotation (expérimentale) @SuperBuilder. La seule restriction est que chaque classe de la hiérarchie doit avoir le @SuperBuilder annotation. Il n'y a aucun moyen de mettre @SuperBuilder sur toutes les sous-classes, car Lombok ne peut pas connaître toutes les sous-classes au moment de la compilation. Voir documentation lombok pour plus de détails.

Exemple:

@SuperBuilder
public abstract class Superclass {
    private int field1;
}

@SuperBuilder
public class Subclass extends Superclass {
    private int field2;
}

Subclass instance = Subclass.builder().field1(1).field2(2).build();
6
Jan Rieke