Warning equals/hashCode on @Data annotation lombok with inheritance
JavaLombokJava Problem Overview
I have a entity which inherits from other. On other hand, I'm using lombok project to reduce boilerplate code, so I put @Data
annotation. The annotation @Data
with inheritance produces the next warning:
>Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add @EqualsAndHashCode(callSuper=false)
to your type.
Is it advisable to add annotation @EqualsAndHashCode (callSuper = true)
or @EqualsAndHashCode (callSuper = false)
? If it is not added, Which one is it callSuper=false
or callSuper=true
?
Java Solutions
Solution 1 - Java
The default value is false
. That is the one you get if you don't specify it and ignore the warning.
Yes, it is recommended to add an @EqualsAndHashCode
annotation on the @Data
annotated classes that extend something else than Object. I cannot tell you if you need true
or false
, that depends on your class hierarchy, and will need to be examined on a case-by-case basis.
However, for a project or package, you can configure in lombok.config
to call the super methods if it is not a direct subclass of Object.
lombok.equalsAndHashCode.callSuper = call
See the configuration system documentation on how this works, and the @EqualsEndHashCode
documentation for the supported configuration keys.
Disclosure: I am a lombok developer.
Solution 2 - Java
@EqualsAndHashCode(callSuper=true)
should resolve the warning.
Solution 3 - Java
The main original question is:
> Is it advisable to add annotation @EqualsAndHashCode (callSuper = > true) or @EqualsAndHashCode (callSuper = false)?
The accepted answer is basically just:
> ...that depends...
To expand on that, the documentation on @EqualsAndHashCode has some solid guidance on which to choose. Especially this, IMHO:
> By setting callSuper to true, you can include the equals and hashCode > methods of your superclass in the generated methods. For hashCode, the > result of super.hashCode() is included in the hash algorithm, and > forequals, the generated method will return false if the super > implementation thinks it is not equal to the passed in object. Be > aware that not all equals implementations handle this situation > properly. However, lombok-generated equals implementations do handle > this situation properly, so you can safely call your superclass equals > if it, too, has a lombok-generated equals method.
To distill this down a bit: Chose 'callSuper=true' if you are inheriting from a superclass that either has no state information, or itself is using the @Data annotation, or has implementations of equals/hash that "handle the situation properly" - which I interpret to mean returning a proper hash of the state values.
Solution 4 - Java
If you want to compare the members of the superclass as well, then use @EqualsAndHashCode(callSuper=true)
. If, however, you only want to compare fields in the current class you can use @EqualsAndHashCode(callSuper=false)
which is the default option.
If you use the Delombok-feature you can see that the difference is that when set to true
this line is added to the generated equals method if (!super.equals(o)) return false;
. If you have members in the superclass that should be taken into account when comparing two objects, then it has to be set to true to compare correctly.