Today, I came across a problem and found a beautiful solution for it, which is pretty much straight forward, but the problem may occur to anyone while using the Lombok Library for java. So let’s look at the problem.
The Problem
I have a class Person, which consists of some fields. It is annotated with the @Builder annotation of lombok, so that lombok can generate the builder for this class. Below is the code for the class Person –
import lombok.Builder; | |
@Builder | |
public class Person { | |
private final String firstName; | |
private final String lastName; | |
private final String middleName; | |
} |
Now, I created a sub-class of Person, Student, since it needs all the fields from Person plus an additional field. I again used @Builder annotation on it to generate the builders for this class as well. Below is the code for Student –
import lombok.Builder; | |
@Builder | |
public final class Student extends Person { | |
private final String rollNumber; | |
} |
Now, what I expected was that every thing will run smoothly and I will be able to access the fields of parent class from child class builder and live my life happily. But NOPE!! Accessing parent class fields from child class builder is not allowed. So, the problem was to build a class, that is inheriting fields from a super class also having the @Builder annotation. So, let’s see how I was able to solve it.
The Solution
The solution was amazingly simple. First, you will have to define a constructor for the Student class, passing all the fields you want in Student, i.e., fields of Person as well as Student. You will now notice that the Person fields are now accessible from Student builder. But now, when you try to compile the program, it will throw an exception stating that the return type of child builder is incompatible with the parent builder. This happens because the child class is trying to expose both, its own and parent class’ builder, with same name. If we change the name of the builder of any one class, then we will be able to solve this problem. To give a custom name to the builder, we can use the builder argument builderMethodName and assign it to a builder name. The new code for Student class is as below –
import lombok.Builder; | |
public final class Student extends Person { | |
private final String rollNumber; | |
@Builder(builderMethodName = "studentBuilder") | |
public Student(final String firstName, final String lastName, final String middleName, final String rollNumber) { | |
super(firstName, lastName, middleName); | |
this.rollNumber = rollNumber; | |
} | |
} |
Now, instead of using Student.builder() we will use Student.studentBuilder(), and now when we compile our program, we will be able to compile it successfully and can now use our Student object freely.
I hope this blog was helpful for you and you got to learn something new. Thanks and happy blogging!