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


103

私は他から継承するエンティティを持っています。一方、ボイラープレートコードを減らすためにlombokプロジェクトを使用しているので、@Dataアノテーションを付けます。@Data継承のある注釈は、次の警告を生成します。

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

注釈を追加することが賢明です@EqualsAndHashCode (callSuper = true)@EqualsAndHashCode (callSuper = false)?それが追加されていない場合は、そのどちらですcallSuper=falsecallSuper=true

回答:


125

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

はい、Object以外のものを拡張するアノテーション付きクラスに@EqualsAndHashCodeアノテーションを追加することをお勧めし@Dataます。クラス階層に応じて、trueまたはが必要かどうかはわかりませんfalse。ケースバイケースで調査する必要があります。

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

lombok.equalsAndHashCode.callSuper = call

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

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


私のために働いた。しかし、ただのsrc /メイン/リソースでないリソースディレクトリにある、すなわち内のsrc /メイン/ジャワではなく、Javaのソースのルートディレクトリに配置する必要がありdelombokプラグインのためにそれまで、この設定ファイルを選択することを念頭に置いておく
user577736

1
@Roelなぜデフォルトがfalseなのか疑問に思います。私は反対のことを期待していたでしょう。また、デフォルトでtoString()にsuperを呼び出す同等の方法はありますか?「@ToString(callSuper = true)」は実行できますが、そのような構成設定は表示されません。ありがとう。
David Siegal

@Dataの前または後に@EqualsAndHashCode(callSuper = true)を追加するかどうかは重要ですか?
アンナクライン

@AnnaKlein順序は関係ありません
ダンカーター

47

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


1
Roelの提案は「lombok.equalsAndHashCode.callSuper = call」で行われるべきではないと思うので、これは正解であるはずです。代わりに、各クラスの決定を行う必要があります。
アンナクライン

4
@AnnaKleinそうは思いません。実際、この回答はコメントである必要があります。ここに新しい情報はありません。私の質問でそれを見つけることができます。私は@EqualsAndHashCode警告を解決することを知っていました。
ポー

実際には、受け入れられた回答(および以下の私の回答)に従って、注釈で「callSuper = true」または「callSuper = false」のいずれかを選択する必要があります。
アダムワイズ

27

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

アノテーション@EqualsAndHashCode(callSuper = true)または@EqualsAndHashCode(callSuper = false)を追加することをお勧めしますか?

受け入れられた答えは基本的にただです:

...場合によります...

それを拡張するために、@ EqualsAndHashCodeのドキュメントには、選択するための確かなガイダンスがあります。特にこれ、私見:

callSuperをtrueに設定することにより、生成されたメソッドにスーパークラスのequalsメソッドとhashCodeメソッドを含めることができます。hashCodeの場合、super.hashCode()の結果はハッシュアルゴリズムに含まれ、それ以前に、スーパー実装が渡されたオブジェクトと等しくないと判断した場合、生成されたメソッドはfalseを返します。すべてのequals実装がこの状況を適切に処理するわけではないことに注意してください。ただし、lombokで生成されたequals実装はこの状況を適切に処理するため、スーパークラスがlombokで生成されたequalsメソッドを持っている場合は、安全に呼び出すことができます。

これを少し詳しく説明するには:状態情報がないスーパークラスから継承している場合、またはそれ自体が@Dataアノテーションを使用している場合、または「状況を適切に処理する」equals / hashの実装がある場合は、「callSuper = true」を選択します。 -これは、状態値の適切なハッシュを返すことを意味すると解釈します。


これが、callSuper = falseとcallSuper = trueのどちらを選択するかをよく説明している答えだと思います。
prageeth

10

スーパークラスのメンバーも比較する場合は、を使用します@EqualsAndHashCode(callSuper=true)。ただし、現在のクラスのフィールドのみを比較する場合@EqualsAndHashCode(callSuper=false)は、デフォルトのオプションである使用できます。

Delombok機能を使用する場合、違いは、trueこの行に設定すると、生成されたequalsメソッドに追加されることですif (!super.equals(o)) return false;。2つのオブジェクトを比較するときに考慮する必要があるスーパークラスのメンバーがある場合、正しく比較するにはtrueに設定する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.