龙目岛@builder扩展另一个类的类

2022-08-31 14:44:38

我有两个类扩展。我需要在类上放置@Builder注释,这样我就不需要自己创建构建器。ChildParent

package jerry;// Internal compiler error: java.lang.NullPointerException

import lombok.AllArgsConstructor;
import lombok.Builder;

@AllArgsConstructor(onConstructor=@__(@Builder))
public class Child extends Parent { 
//Multiple markers at this line
//  - Implicit super constructor Parent() is undefined. Must explicitly invoke another constructor
//  - overrides java.lang.Object.toString

   private String a;
   private int b;
   private boolean c;

}


@Builder
public class Parent {
    private double d;
    private float e;
}

我需要能够构建子实例,以便

Child child = Child.builder().a("aVal").b(1000).c(true).d(10.1).e(20.0F).build();

但到目前为止,我得到了代码注释中提到的错误。任何人都可以为我指出正确的方向,如何用龙目岛或任何其他类似的图书馆来实现它?

子问题

为什么编译却不编译?@AllArgsConstructor(onConstructor=@__(@Autowired))@AllArgsConstructor(onConstructor=@__(@Builder))


答案 1

自1.18.2版本以来,龙目岛包括新的实验@SuperBuilder。它支持来自超类(也是抽象类)的字段。有了它,解决方案就这么简单:

@SuperBuilder
public class Child extends Parent {
   private String a;
   private int b;
   private boolean c;
}

@SuperBuilder
public class Parent {
    private double d;
    private float e;
}

Child instance = Child.builder().b(7).e(6.3).build();

更新 2019-10-09:如果您使用 IntelliJ,则至少需要 0.27 版的 IntelliJ Lombok 插件才能使用 。@SuperBuilder

PS:不起作用,因为它是龙目岛在编译期间转换为代码的注释处理注释。生成然后翻译新的龙目岛注释将需要多次迭代的注释处理,而龙目岛不支持这一点。相比之下,它是运行时可用的常规 Java 注释。@AllArgsConstructor(onConstructor=@__(@Builder))@Builder@Autowired


答案 2

请参见 https://blog.codecentric.de/en/2016/05/reducing-boilerplate-code-project-lombok/@Builder和继承部分)

根据您的课程进行调整

@AllArgsConstructor
public class Parent {
  private double d;
  private float e;
}

public class Child extends Parent {
  private String a;
  private int b;
  private boolean c;

  @Builder
  public Child(String a, int b, boolean c, double d, float e) {
    super(d, e);
    this.a = a;
    this.b = b;
    this.c = c;
  }
}

使用此设置

Child child = Child.builder().a("aVal").b(1000).c(true).d(10.1).e(20.0F).build();

工作正常


推荐