私に学ぶ(Effective Java 2)第8条:equalsを上書きするときは共通の約束を守ってください


第8条:equalsを上書きする場合は共通の約定を守ってください
equalsメソッドを上書きするのは簡単そうに見えますが、多くの上書き方法がエラーを引き起こし、結果は非常に深刻です.このような問題を最も回避しやすい方法はequalsメソッドを上書きすることであり,この場合,クラスの各インスタンスはそれ自体と等しいだけである.次のいずれかの条件を満たす場合、これは望ましい結果です.
1クラスの各インスタンスは本質的に一意である.値(value)ではなくアクティブなエンティティを表すクラスの場合、たとえばThread.Objectが提供するequals実装はこれらのクラスにとって正しい動作である.
2クラスが「論理的同等(logical equality)」のテスト機能を提供しているかどうかは気にしない.例えばjava.util.Randomはequalsを上書きし、2つのRandomインスタンスが同じ乱数列を生成するかどうかを確認しますが、設計者はお客様がこのような機能を必要としているとは思いません.この場合,Objectから引き継いだequals実装で十分である.
3スーパークラスはequalsをカバーしており,スーパークラスから継承される行為はサブクラスにも適切である.例えば、ほとんどのSetインプリメンテーションはAbstractSetからequalsインプリメンテーションを継承し、Listインプリメンテーションはequalsからインプリメンテーションし、MapインプリメンテーションはAbstractMapからequalsインプリメンテーションを継承する.
4クラスはプライベートまたはパケットレベルプライベートであり、equalsメソッドが呼び出されないことを確認できます.この場合、予期せぬ呼び出しを防止するためにequalsを上書きすべきであることは間違いありません.
equalsメソッドを上書きするときは、共通の約束を守らなければなりません.equals法は等価関係を実現した(equivalence relation):
自己反転(reflexive):null以外の参照値xの場合、x.equals(x)はtrueを返さなければなりません.対称性(symmetric):null以外の参照値xとyについて、y.equals(x)がtrueを返す場合にのみ、x.equals(y)はtrueを返す必要があります.伝達性(transitive):null以外の参照値x、y、zについて、x.equals(y)がtrueに戻り、y.equals(z)もtrueに戻る場合、x.equals(z)もtrueに戻る必要があります.コンシステンシ(consistent):null以外の参照値xとyについて、equalsの比較操作がオブジェクトで使用される情報が変更されていない限り、x.equals(y)を複数回呼び出すと、一致してtrueが返されるか、falseが一致して返されます.null以外の参照値xの場合、x.equals(null).
 //           
    @Override
    public boolean equals(Object obj) {

        throw new AssertionError();
        //return super.equals(obj);
    }
    //  equals  5   
    /*
    1,     z.equals(z) == true
    2,    z.equals(y) == true    y.equals(z) == true
    3,     z.equals(y) == true               true
    4,     z.equals(y) == true  y.equals(x) == true    z.equals(x) == true
    5,     z.equals(null) == false

      :
        1)   ==               
        2)   instanceof             
        3)          
        4)          (       )                      
            Objects ((a == b) || (a != null && a.equals(b)))
        5)              

     :   equals         hashCode  
           equals    boj        ,           ,   @Override    
     */

Liskov substitution principle:各タイプの重要な属性もサブタイプに適用されます.したがって、このタイプの作成には、任意の方法を恐れ、そのサブタイプでも同様にうまく動作する必要があります.
**equalsメソッドの作成が完了したら、対称性、伝達性、一貫性を考慮する必要があります.**テスト用のテスト例も作成します.一般に、自己反転と非空は自動的に満たされます.equalsを書くためのいくつかの警告:
1.equalsを上書きする場合はhashCodeを上書きします.
2、equalsメソッドをあまりスマートにしようとしないでください.いろいろな等価関係を探しすぎると、トラブルに陥りやすい.
3、equalsの名前の中のObjectオブジェクトを他のタイプに置き換えないでください.