Reputation: 24160
Lombok @Builder doesn't work for inheritance use cases:
For example
class Foo{
protected int xyz1;
.....
protected String xyz7;
}
class Bar extends Foo{
}
For given use case Lombok will not be able to generate methods to set value of parameter defined in Foo class.
A workaround for this is:
Is there a better workaround ?
Upvotes: 45
Views: 48885
Reputation: 1927
I leave this here for reference, as other answers demonstrate there is now (not at the time this answer was posted) a @SuperBuilder feature available now in the library which seems more fitting.
It´s a bit hidden, but people have had this question before, see:
https://reinhard.codes/2015/09/16/lomboks-builder-annotation-and-inheritance/
To summarise the blog post
@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;
}
}
Would allow you to use
Child.builder().a("testA").b("testB").build()
Upvotes: 21
Reputation: 5818
Lombok has introduced experimental features with version: 1.18.2 for inheritance issues faced with Builder annotation, and can be resolved with @SuperBuilder annotation as below.
@SuperBuilder
public class ParentClass {
private final String a;
private final String b;
}
@SuperBuilder
public class ChildClass extends ParentClass{
private final String c;
}
Now, one can use Builder class as below (that was not possible with @Builder annotation)
ChildClass.builder().a("testA").b("testB").c("testC").build();
Upvotes: 60
Reputation: 1827
There is a solution to this problem currently in the works. Check the progress here: https://github.com/rzwitserloot/lombok/pull/1337
Upvotes: 0