LoginSignup
0
0

More than 3 years have passed since last update.

【Effective Javaを読む】 第3章 項目8 『equalsをオーバーライドする時は一般契約に従う』

Last updated at Posted at 2020-07-31

第3章について

第2章はオブジェクトの生成と消滅についてのエッセンスでした。
第3章は「Object」クラスについてのお話です。

Objectクラスと一般契約

・Objectは具象クラスであるにもかかわらず主に拡張されるために設計されている
・finalでないメソッド(equals, hashCode, toString, clone, finalize)はすべてオーバーライドされるように設計されているので、明示的な一般契約(general contract)を持っている
・オーバーライドするクラスは一般契約に従わないと適切に動作しなくなる

equalsをオーバーライドする時は一般契約に従う

equalsメソッドをオーバーライドしてはならない場合

equalsメソッドをオーバーライドするのは簡単ですが、間違った方法でオーバーライドしてしまう場合が多々あるので、次の条件のどれかに当てはまる場合はオーバーライドしないほうがいい。

・クラスの個々のインスタンスが、本質的に一意である場合

・「論理的等価性(logical equality)」検査を、クラスが提供するかどうか関心がない場合

・スーパークラスが既にequalsをオーバーライドしており、スーパークラスの振る舞いがこのクラスに対して適切である場合

・クラスがprivateあるいはパッケージプライベートであり、その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)とy.equals(z)がtrueを返すならば、x.equals(z)はtrueを返さなければならない
・整合的(consistent):nullでない任意の参照値xとyに対して、オブジェクトに対するequals比較に使用される情報が変更されなければ、x.equals(y)の複数回呼び出しは、終始一貫してtrueを返すか、終始一貫してfalseを返さなけらばならない

続く

【Effective Javaを読む】 第3章 項目9 『equalsをオーバーライドする時は、常にhashCodeをオーバーライドする』
https://qiita.com/Natsukii/items/ac195b5542ba3348ed29

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0