I have two classes Child
extends Parent
. I need to put @Builder annotation on the classes such that I do not need to create the builder my self.
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;
}
I need to be able to build child instance such that
Child child = Child.builder().a("aVal").b(1000).c(true).d(10.1).e(20.0F).build();
But so far I am getting the errors mentioned in side that code comments. Can any one point me to the right direction how to achieve it with lombok or any other similar library ?
Sub-question
Why does @AllArgsConstructor(onConstructor=@__(@Autowired))
compile but @AllArgsConstructor(onConstructor=@__(@Builder))
does not?
Since release 1.18.2 lombok includes the new experimental @SuperBuilder
. It supports fields from superclasses (also abstract ones). With it, the solution is as simple as this:
@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();
Update 2019-10-09: If you use IntelliJ, you need at least version 0.27 of the IntelliJ Lombok plugin to use @SuperBuilder
.
PS: @AllArgsConstructor(onConstructor=@__(@Builder))
does not work because @Builder
is an annotation-processing annotation that lombok translates to code during compilation. Generating and then translating new lombok annotation would require several iterations of annotation processing, and lombok does not support that. @Autowired
, in contrast, is a regular Java annotation available at runtime.