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:
- Manual creating constructor of Bar.
- Putting a Builder annotation on that constructor.
Is there a better workaround ?
13 Answers
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(); 3 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:
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() 3 There is a solution to this problem currently in the works. Check the progress here: