Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Lombok@builder在扩展另一个类的类上_Java_Spring_Hibernate_Lombok - Fatal编程技术网

Java Lombok@builder在扩展另一个类的类上

Java Lombok@builder在扩展另一个类的类上,java,spring,hibernate,lombok,Java,Spring,Hibernate,Lombok,我有两个类ChildextendsParent。我需要在类上添加@Builder注释,这样我就不需要自己创建生成器了 package jerry;// Internal compiler error: java.lang.NullPointerException import lombok.AllArgsConstructor; import lombok.Builder; @AllArgsConstructor(onConstructor=@__(@Builder)) public cla

我有两个类
Child
extends
Parent
。我需要在类上添加@Builder注释,这样我就不需要自己创建生成器了

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();
但到目前为止,我得到了代码注释中提到的错误。有人能告诉我正确的方向吗?如何使用lombok或其他类似的库来实现它

子问题

为什么
@allargsconstuctor(onConstructor=@uuuu(@Autowired))
编译而
@allargsconstuctor(onConstructor=@uuu(@Builder))
不编译?

请参见(@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();

正常工作

我有一个类似但略有不同的用例。在我的例子中,我有一个构建和执行请求的抽象超类链。不同的请求共享一些公共参数,但并非每个请求都支持所有参数。具体请求的构建器应该只提供为给定请求设置支持参数的方法

我从基于构造函数的构建器实现开始,但这导致了太多的样板代码,特别是当您有许多字段需要配置时。我现在提出了以下解决方案,对我来说看起来更干净

基本上,具体的子类定义了构建器应该支持的实际字段,Getter注释将导致覆盖相应的超类方法。抽象超类中的getter甚至可以定义为抽象的,以需要具体的实现来定义这些字段

public abstract class AbstractSuperClass1 {
    protected String getParamA() { return "defaultValueA"; }

    public final void doSomething() {
        System.out.println(getParamA());
        doSomeThingElse();
    }

    protected abstract void doSomeThingElse();
}




自1.18.2版以来,lombok包括。它支持来自超类(也是抽象类)的字段。有了它,解决方案非常简单:

@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,您至少需要IntelliJ Lombok插件的0.27版本才能使用
@SuperBuilder


PS:
@allargsconstuctor(onConstructor=@uuu(@Builder))
不起作用,因为
@Builder
是一个注释处理注释,lombok在编译期间将其转换为代码。生成并翻译新的lombok注释将需要注释处理的多次迭代,而lombok不支持这一点<相反,code>@Autowired是运行时可用的常规Java注释。

您需要在每个对象中使用
@SuperBuilder(toBuilder=true)

@Data
@SuperBuilder(toBuilder = true)
public class Parent extends Child {
}

@Data
@SuperBuilder(toBuilder = true)
public class Child {
}

好的,我试过了。。。但是我不能为任何在我的团队中是代码约定的函数提供超过7个参数,如果我提供超过7个参数,构建就会失败。我的原始代码在super/parent-classis中有30多个字段,我不知道如果不在child-constructor/@Builder中列出所有的parent+child字段,是否可以完成它,至少我没有找到任何这样的示例。作为一种解决方案,您可能会考虑禁止这个特定类的代码约定(至少我认为它来自一些静态代码分析器,如PMD、FunBug、声纳等,可以被抑制),如果父类也有@ Builder,则不起作用。annotation@ShrikantPrabhu那样的话,我现在的处境,我只是中止继承并复制字段;幸运的是,只有几个字段是相同的。当您从不能修改的父类扩展时,这个解决方案也非常有效!!!!!谢谢,我目前正在尝试评估。不过,只是一句警告:IntelliJ Lombok插件尚不支持。太好了,我将检查IntelliJ Lombok插件的当前版本0.27,该版本现在支持
@SuperBuilder
@JanRieke,它可以完美地工作!除非升级到1.18.16,否则无法使用泛型类型扩展超类谢谢,我会检查
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;

@Getter(AccessLevel.PROTECTED) @Builder
public class ConcreteClass2 extends AbstractSuperClass2 {
    private final String paramA;
    private final String paramB;

    public static void main(String[] args) {
        ConcreteClass2.builder()
            .paramA("NonDefaultValueA").paramB("NonDefaultValueB")
            .build().doSomething();
    }
}
@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();
@Data
@SuperBuilder(toBuilder = true)
public class Parent extends Child {
}

@Data
@SuperBuilder(toBuilder = true)
public class Child {
}