lombok @Data complains "lombok needs a default constructor in the base class", when abstract class having final field
The @Data
annotation does not add a default contructor.
Try to add a @NoArgsConstructor
to your Base Class B
to generate a default constructor with Lombok.
You can also read up what @Data
actually means here.
One problem is that @Data
is meant for mutable data and there's nothing mutable in your classes. So using @Data
is simply wrong... and whether it compiles or not doesn't really matter.
If you want mutable data, then remove the final
field. For immutable data, make all fields final
and use @Value
. Sometimes, partially mutable data is needed, but I try hard to avoid it as it's confusing (some fields can be set, some can't) and they provide disadvantages of both.
The other problem is that Lombok can't access class hierarchies. With B
having a final field, you need it to be initialized in the constructor, which means that A
's constructor has to call a non-default constructor. This isn't possible with Lombok. There's @Superbuilder
in Lombok, which is about the only feature of Lombok dealing well with class hierarchies.
This does not event compile. In Intellij
, when you are not sure what is the problem with lombok
code, you can open class in which you are unsure, go on Refactor
-> Delombok
-> All lombok annotations
and you will see what lombok actually create for you.