web-dev-qa-db-fra.com

Contournement de l'héritage Lombok @Builder

Lombok @Builder ne fonctionne pas pour les cas d'utilisation d'héritage:

Par exemple 

class Foo{
 protected int xyz1;
 .....
 protected String xyz7;
}


class Bar extends Foo{

}

Pour un cas d'utilisation donné, Lombok ne pourra pas générer de méthodes pour définir la valeur du paramètre défini dans la classe Foo. 

Une solution de contournement pour ceci est:

  1. Création manuelle du constructeur de Bar. 
  2. Mettre une annotation Builder sur ce constructeur.

Existe-t-il une meilleure solution de contournement? 

10
Vivek Goel

Lombok a introduit des fonctionnalités expérimentales avec la version 1.18.2 pour les problèmes d'héritage liés à l'annotation Builder, et peut être résolu avec l'annotation @SuperBuilder comme ci-dessous.

@SuperBuilder
public class ParentClass {
    private final String a;
    private final String b;
}

@SuperBuilder
public class ChildClass extends ParentClass{
    private final String c;
}

Maintenant, on peut utiliser la classe Builder comme ci-dessous (ce n'était pas possible avec l'annotation @Builder)

ChildClass.builder().a("testA").b("testB").c("testC").build();
9
Amit Kaneria

C'est un peu caché, mais les gens ont déjà eu cette question, voir:

https://reinhard.codes/2015/09/16/lomboks-builder-annotation-and-inheritance/

Pour résumer le blog

@AllArgsConstructor
public class Parent {
  private String a;
}

public class Child extends Parent {

  private String b;

  @Builder
  private Child(String a, String b){
    super(a);
    this.b = b;
  }
}

Vous permettrait d'utiliser

Child.builder().a("testA").b("testB").build()
8
fd8s0

Il existe actuellement une solution à ce problème. Vérifiez l'état d'avancement ici: https://github.com/rzwitserloot/lombok/pull/1337

0
Jacques Koorts