@EqualsAndHashCode
の callSuper
には true
か false
を指定できます。
false
にした場合
デフォルトの挙動で、java.lang.Object
を直接継承したクラスでは適切です。
他のクラスを継承したクラスで true
を指定していないと警告が出ます。警告されるのは、false
が適切なのはスーパークラスに equals
の判定に使うフィールドが存在しない場合くらいしかないためです。true
に設定して callSuper
の機能に頼るか、super.equals(Object)
を呼び出さなくても良いような実装を頑張って書く必要があります。
false
が適切な場合がないわけではありません。『Effective Java』(第3版、p. 47) に以下の記述があるのですが、この Circle
や Rectangle
でも警告が出ます。このような場合は false
にしてください。
何も値要素を持たない抽象クラス Shape、radius フィールドを追加した Circle サブクラス、length と width フィールドを追加した Rectangle サブクラスを持てます。
true
にした場合
super.equals(Object)
が false
のときは false
を返すようにすることで、スーパークラスのフィールドを equals
の判定で使うようにします。Object.equals(Object)
を使って構わないなら Lombok に equals
を生成させるはずがありませんので、正しく処理するためにはスーパークラスで equals
がオーバーライドされている必要があります。
ちなみに、java.lang.Object
を直接継承したクラスで指定すると、意味のある処理にならないのでコンパイル エラーになります。
参考