LoginSignup
4
1

More than 1 year has passed since last update.

Lombok の @EqualsAndHashCode の callSuper について

Last updated at Posted at 2022-04-26

@EqualsAndHashCodecallSuper には truefalse を指定できます。

false にした場合

デフォルトの挙動で、java.lang.Object を直接継承したクラスでは適切です。

他のクラスを継承したクラスで true を指定していないと警告が出ます。警告されるのは、false が適切なのはスーパークラスに equals の判定に使うフィールドが存在しない場合くらいしかないためです。true に設定して callSuper の機能に頼るか、super.equals(Object) を呼び出さなくても良いような実装を頑張って書く必要があります。

false が適切な場合がないわけではありません。『Effective Java』(第3版、p. 47) に以下の記述があるのですが、この CircleRectangle でも警告が出ます。このような場合は false にしてください。

何も値要素を持たない抽象クラス Shape、radius フィールドを追加した Circle サブクラス、length と width フィールドを追加した Rectangle サブクラスを持てます。

true にした場合

super.equals(Object)false のときは false を返すようにすることで、スーパークラスのフィールドを equals の判定で使うようにします。Object.equals(Object) を使って構わないなら Lombok に equals を生成させるはずがありませんので、正しく処理するためにはスーパークラスで equals がオーバーライドされている必要があります。

ちなみに、java.lang.Object を直接継承したクラスで指定すると、意味のある処理にならないのでコンパイル エラーになります。

参考

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1