Lombok @Builder inheritance workaround

May 2024 · 2 minute read

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 ?

    1

    3 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:

    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() 
    3

    There is a solution to this problem currently in the works. Check the progress here: https://github.com/rzwitserloot/lombok/pull/1337

    ncG1vNJzZmirpJawrLvVnqmfpJ%2Bse6S7zGiorp2jqbawutJoampuZml9eoSOpaammp%2BgeqPByKWbnqpdnrupsdGiq5qmk5p6uLvRpJirp6WjsQ%3D%3D