web-dev-qa-db-ja.com

継承を伴う@Dataアノテーションlombokのequals / hashCodeの警告

他から継承するエンティティがあります。一方、定型コードを減らすためにロンボクプロジェクトを使用しているので、@Dataアノテーションを追加します。継承を伴う注釈@Dataは、次の警告を生成します。

Equals/hashCode実装を生成しますが、このクラスはJava.lang.Objectを拡張しませんが、スーパークラスを呼び出しません。これが意図的なものである場合は、@EqualsAndHashCode(callSuper=false)をタイプに追加してください。

注釈@EqualsAndHashCode (callSuper = true)または@EqualsAndHashCode (callSuper = false)を追加することをお勧めしますか?追加されない場合、どちらかcallSuper=falseまたはcallSuper=true

53
Pau

デフォルト値falseです。それを指定せず、警告を無視した場合に得られるものです。

はい、Object以外を拡張する@EqualsAndHashCode注釈付きクラスに@Data注釈を追加することをお勧めします。 trueまたはfalseが必要かどうかはわかりませんが、これはクラス階層に依存し、ケースバイケースで調査する必要があります。

ただし、プロジェクトまたはパッケージの場合、lombok.configで設定して、オブジェクトの直接のサブクラスでない場合にスーパーメソッドを呼び出すことができます。

lombok.equalsAndHashCode.callSuper = call

これがどのように機能するかについては 構成システムのドキュメント を、サポートされている構成キーについては @EqualsEndHashCodeドキュメント を参照してください。

開示:私はロンボク島の開発者です。

76
Roel Spilker

@EqualsAndHashCode(callSuper=true)は警告を解決する必要があります。

28
noscreenname

主な元の質問は次のとおりです。

アノテーション@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」を選択します-状態値の適切なハッシュを返すことを意味すると解釈します。

3
Adam Wise