他から継承するエンティティがあります。一方、定型コードを減らすためにロンボクプロジェクトを使用しているので、@Data
アノテーションを追加します。継承を伴う注釈@Data
は、次の警告を生成します。
Equals/hashCode実装を生成しますが、このクラスはJava.lang.Objectを拡張しませんが、スーパークラスを呼び出しません。これが意図的なものである場合は、
@EqualsAndHashCode(callSuper=false)
をタイプに追加してください。
注釈@EqualsAndHashCode (callSuper = true)
または@EqualsAndHashCode (callSuper = false)
を追加することをお勧めしますか?追加されない場合、どちらかcallSuper=false
またはcallSuper=true
?
デフォルト値 はfalse
です。それを指定せず、警告を無視した場合に得られるものです。
はい、Object以外を拡張する@EqualsAndHashCode
注釈付きクラスに@Data
注釈を追加することをお勧めします。 true
またはfalse
が必要かどうかはわかりませんが、これはクラス階層に依存し、ケースバイケースで調査する必要があります。
ただし、プロジェクトまたはパッケージの場合、lombok.config
で設定して、オブジェクトの直接のサブクラスでない場合にスーパーメソッドを呼び出すことができます。
lombok.equalsAndHashCode.callSuper = call
これがどのように機能するかについては 構成システムのドキュメント を、サポートされている構成キーについては @EqualsEndHashCode
ドキュメント を参照してください。
開示:私はロンボク島の開発者です。
@EqualsAndHashCode(callSuper=true)
は警告を解決する必要があります。
主な元の質問は次のとおりです。
アノテーション@EqualsAndHashCode(callSuper = true)または@EqualsAndHashCode(callSuper = false)を追加することをお勧めしますか?
受け入れられる答えは、基本的には次のとおりです。
...場合によります...
それを拡張するために、 @ EqualsAndHashCode のドキュメントには、選択すべきいくつかの堅実なガイダンスがあります。特にこれ、私見:
CallSuperをtrueに設定することにより、生成されたメソッドにスーパークラスのequalsメソッドとhashCodeメソッドを含めることができます。 hashCodeの場合、super.hashCode()の結果はハッシュアルゴリズムに含まれますが、同等の場合、スーパーインプリメンテーションが渡されたオブジェクトと等しくないと判断した場合、生成されたメソッドはfalseを返します。すべてのequals実装がこの状況を適切に処理するわけではないことに注意してください。ただし、lombokで生成されたequals実装はこの状況を適切に処理するため、スーパークラスのequalsにもlombokで生成されたequalsメソッドがあれば安全に呼び出すことができます。
これを少し蒸留するには:状態情報を持たないスーパークラスから継承している場合、またはそれ自体が@Dataアノテーションを使用している場合、または「状況を適切に処理する」equals/hashの実装がある場合、「callSuper = true」を選択します-状態値の適切なハッシュを返すことを意味すると解釈します。