@EqualsAndHashCode

1、@データアノテーションはこれらのノートが含まれています

*ゲッター@see 
* @seeセッター
* @see RequiredArgsConstructor 
* @seeのToStringメソッド
* @see EqualsAndHashCode 
* @see lombok.Value

1.これは、注釈等しい(他の物体)とhashCode()メソッドを生成します。 
2.それは非静的、非一時的な属性をデフォルト 
3.いくつかのプロパティを除外パラメータ除外することができる 
。4.のみ使用してパラメータの属性を指定 
5は唯一のクラスで定義されたデフォルト属性と親クラスを呼び出すことはありませんが方法 
6. = trueがcallSuper問題を解決することができます。この方法は、親クラスのメソッド呼び出しが生成できました。

もう一つ:@Data同等コレクション@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode 5つの注釈。

 

2、データが含まれている@ EqualsAndHashCodeは、equalsメソッドとhashCodeを書き換えます

3、あなたのためのEqualsAndHashCodeは注意することは、親の属性ポイントを継承します

公式文書を通じて、あなたは@Dataノート使用して、ノートが@EqualsAndHashCodeを持っている場合、それはこのクラスのequals(他のオブジェクト)とhashCode()メソッドを持っていますし、親クラスのプロパティを使用していない学ぶことができ、これは、可能性のある問題につながります。 
例えば、同じクラスの複数の属性のいくつかを持って、それらは親クラスを定義し、正確ID(プライマリ・キー・データベース)親クラスであり、それは比較の際に被写体の部分を持って、彼らは同じではなく、ロンボクため自動的に生成された等号(他の物体)とhashCode()メソッドは、それによってエラーの原因となって、等しくなるように決定されます。

この問題を解決する方法は簡単です: 
1. @Getter @Setter @ToString場所@Dataとカスタムは、(他のオブジェクト)に等しいとhashCode()メソッド、例えば、いくつかの主キーが決定されたベースのIDだけの平等は十分です。 
2.同時に使用又は添加@EqualsAndHashCode(callSuper = true)を使用@Dataに注釈。

 

4、試験

@data 
// @ EqualsAndHashCode(callSuper =真)
UcsAccountLogはBaseVOが実装延びパブリッククラスシリアライズ{ 
 
    プライベート静的最終長いのserialVersionUID = 1L。
 
    プライベート文字列ID; 
    
}

 

@data 
パブリッククラスBaseVO { 
    パブリック文字列バージョン。
}

 

/ ** 
     *まず、そのようなクラスのハッシュテーブルの使用など基本となるハッシュテーブルクラスをサポートします。
     クラスの* Javaオブジェクト仕様int型のhashCode()メソッド公差三た合意した:
     * <P> 
     *(1)であれば、オブジェクトの情報が使用される方法に等しいように変更されていない場合、hashCodeメソッドは一貫に同じ整数aを返す必要があります同じアプリケーションを複数回、毎回の実行は異なる場合があります。
     * <P> 
     *(2)2つのオブジェクトが思考の方法に等しい場合、別の図面における各オブジェクトコールハッシュコードが同じでなければなりません。
     * <P> 
     *(3)2つのオブジェクトが等しくない場合、戻り値は、ハッシュテーブルのパフォーマンスを向上させることができ、異なる戻り異なる値を受け、hashCodeメソッドに等しくすることができる方法に等しいです。
     *すべての一方のオーバーライドは、ハッシュコードオーバーライドする必要があり等しく
     * @paramの引数
     * / 
    パブリック静的な無効メイン(文字列[] args){ 
        ; UcsAccountLog ucsAccountLog新しい新しいUcsAccountLog =()
        ucsAccountLog.setVersion(」1" ); 
        ucsAccountLog.setId(" 2「);
        =新しい新しいUcsAccountLog ucsAccountLog2 UcsAccountLog();
        ucsAccountLog2.setVersion( "2"); 
        ucsAccountLog2.setId( "2"); 
        HashSetのHashSetの新しい新しいSET =(); 
        set.add(ucsAccountLog); 
        set.add(ucsAccountLog2)
        のSystem.out.println(set.size( ));. 1 // 
        するSystem.out.println(ucsAccountLog.hashCode()== ucsAccountLog2.hashCode()); // trueにすべてのハッシュコードは、ここでハッシュコード等しい書き換えるため
        ないメモリが書き換え可能なハッシュコードしない場合//アドレス値
        のSystem.out.println(ucsAccountLog.equals(ucsAccountLog2)); // trueに
        //ハッシュに従って
        のSystem.out.println(ucsAccountLog == ucsAccountLog2); // ==偽目標アドレスと比較
 
    }

 サブクラスの場合 

// @ EqualsAndHashCode(callSuper =真)

この行を追加しないでください、出力は真真偽であり、我々は結果が満たしていない期待します 

 @EqualsAndHashCodeのデフォルトはハッシュコードを書き換えると、フィールドは、親クラスの値が含まれていないときに等しくされる親クラスを継承していないので、すべてがオブジェクト自体明らかにこれが間違っている内部のフィールドの値を比較します

オープンコメントが正しい偽偽偽出力結果であります

 

 

 

おすすめ

転載: www.cnblogs.com/Andrew520/p/11031623.html