web-dev-qa-db-fra.com

Est-ce que lombok @Builder autorise les extensions

J'ai 2 classes:

import lombok.Builder;
@Builder
public class B extends A {
}

et

import lombok.Builder;
@Builder
public class A {
}

sur le @Builder sur B je reçois le message:

Le type de retour est incompatible avec A.builder ().

Est-ce une limitation de lombok? ou quelque chose que je fais mal?

Si je laisse le @Builder sur A, le générateur de B ne semble pas prendre en compte les champs de A dans les constructeurs pour B.

5
AixNPanes

La dernière version 1.18.2 de Lombok inclut le nouveau @SuperBuilder expérimental . Il supporte l'héritage et les champs des superclasses (aussi abstraits). La seule exigence est que toutes les super-classes doivent avoir l'annotation @SuperBuilder. Avec elle, la solution est aussi simple que cela:

@SuperBuilder
public class B extends A {
   private String b;
}

@SuperBuilder
public class A {
    private String a;
}

B instance = B.builder().b("b").a("a").build();
4
Jan Rieke

Cela n’est possible qu’avec une solution de contournement ( voir n ° 78 )

De Reinhard.codes

Nous utilisons @Builder sur la classe elle-même, mais vous pouvez également le placer sur le constructeur d’une classe ou sur une méthode statique. Dans ce cas, Lombok créera une méthode de définition sur la classe de générateur pour chaque paramètre du constructeur/méthode. Cela signifie que vous pouvez créer un constructeur personnalisé avec des paramètres pour tous les champs de la classe, y compris sa super-classe.

@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;
  }
}
3
Impulse The Fox

Je ne peux plus reproduire votre problème exact, mais c'est peut-être parce que Lombok a évolué.

Une partie de votre question, cependant, était que le constructeur pour être n'inclut pas les champs pour a. Cela reste vrai, de même que pour @AllArgsConstructor. L’héritage n’est pas l’atout majeur de Lombok.

Thad a dit, puisque vous pouvez écrire votre constructeur vous-même et mettre @Builder sur le constructeur, ce qui suit va générer un constructeur pour B comme vous le souhaitez:

@Builder
public class A {
    String a;
}

public class B extends A {

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

    String b;
}
1
Michael Piefel