Effective Java学習ノート第7条---equalsメソッドを書き換える際は共通のルールを守ってください

1635 ワード

次の場合、equalsメソッドを書き換える必要はありません.
  • 同じクラスの異なるインスタンスは本質的に唯一であり、インスタンスには独自のボリューム(Identify)がある.
  • は、クラスが論理的に等しい機能を提供しているかどうかに関心を持たない.
  • 親クラスはequalsメソッドを書き換えており,子クラスにとって継承されたequalsメソッドが最適である.
  • クラスはプライベートまたはパケット可視であり、そのequalsメソッドが呼び出されないことを決定する.

  • equalsメソッドを書き換える必要がある場合は、次のような約束を守らなければなりません.
  • 自己反転性、すなわちx.equals(x)はtrue.
  • 対称性、すなわちx.equals(y)がtrueである場合のみy.equals(x)もtrueであるに違いない.
  • 伝達性、すなわち任意のx,y,zに対して、x.equals(y)がtrueであり、y.equals(z)もtrueである場合、x.equals(z)もtrueでなければならない.
  • の一貫性、すなわち任意のx,yについて、x,yが変更されていない場合、x.equals(y)を複数回呼び出すか、一致してtureを返すか、false.
  • を一致して返す.
  • 空でない参照xに対して、x.equals(null)はfalse.
  • を返さなければならない.
    equalsメソッドを書き換える際の推奨事項:
  • ==オペレータを使用して、実パラメータがオブジェクトを指す同じ参照であるかどうかを確認します.
  • instanceOfを使用して、実パラメータが正しいタイプかどうかを確認します.
  • は2に基づいて,実パラメータを正しいタイプに変換する.
  • 実パラメータのドメインが現在のオブジェクトのドメイン値と等しいかどうかを確認します.
  • equalsメソッドを記述した後、等価関係を満たすかどうかを確認します.

  • 例:
    public boolean equals(Object o)
    {
           if(o== this) return true;
           if(!(o instanceof xxxx) return false;
           xxx in = (xxx)o;
           return ……..
    } 
     
    equalsメソッドを書き換える警告:
  • equalsメソッドに多くのことをさせようとしないでください.
  • equalsを信頼できないリソースに依存させないでください.そうしないと、一貫性に違反します.
  • equalsのオブジェクトを他のタイプに置き換えないでください.
  • このような方法を提供しないでくださいpublic boolean equals(MyClass o)このようなリロードはObjectをカバーするequals方法ではありません.

  • まとめ:equalsメソッドを書き換える必要がない場合は、できるだけ面倒を見ないでください.確かにequalsメソッドを書き換える必要がある場合は、共通の約束を守ります.オブジェクトがプログラムの中で絶えず伝達されるため、プログラムの動作が正常ではなく、クラッシュしてプログラムクラッシュの原因を見つけるのが難しい可能性があります.とにかく、約束を守りましょう.