lombok @Data complains "lombok needs a default constructor in the base class", when abstract class having final field

Richard picture Richard · Sep 4, 2019 · Viewed 10.5k times · Source
@Data
public abstract class B {
   private final String str;
}

@Data
public class A extends B{
   private final String s;
}

Data on class A complains in intellij, but the codes can get compiled successfully through command line, not sure what to do

Answer

maaartinus picture maaartinus · Sep 6, 2019

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.