【Java】「同値」の定義はequalsメソッドをオーバーライドする

Javaにおいて「同じ」という言葉には同じオブジェクト(インスタンス)を表す同一という意味と、
比較するオブジェクト同士の持っている値が等しい(同値である)という二つの意味がある。

同一である
 同じインスタンスである。(参照が同じ)
同値(等価)である
 異なるインスタンスだが同じ値を持っている。

「同一である」を判定するには == 演算子を用いて比較する。


 
一方、「同値(等価)である」つまりオブジェクトが持つ値が等しいかどうかの判定にはequalsメソッドを用いて比較をする。

しかし、

Objectクラスのequalsメソッドのデフォルトでの定義は同一性、すなわち同じインスタンスかどうかを確認する仕様となっている。

Objectクラスのデフォルトのequalsメソッド

よって、自作したオブジェクトクラスの同値性を判定したい場合、
equalsメソッドをそのクラスでオーバーライドする必要がある。

※equalsメソッドをオーバーライド実装した場合、合わせてhashCodeメソッドも定義しなければいけません。
hashCodeメソッドについてはこちらの記事にまとめています。

 

作成したオブジェクトクラス内でequalsメソッドをオーバライドする。

12行目
instanceof演算子でObject型で渡ってきたオブジェクトと
このクラスとの互換性をチェックする。
※同じクラス型、もしくはサブクラスかどうか。
13行目
互換性が確認出来たら、値をチェックするオブジェクトをこのクラスの型にキャストする。
15行目
同値である事の条件を定義する。
それぞれのオブジェクトの変数ageと変数nameを比較している。
すべてのフィールドが等しくなければいけないのか、
または一部のフィールドのみが一致すれば良いのか
 
同じ値を持っているという条件をクラスの作成時に決めることが出来る。
(設計者の判断に委ねられる)

 

Eclipseの自動生成機能を利用してequalsメソッドを追加する場合

クラスファイルを右クリック、「ソース」 「hashCode()およびequals()」の生成を選ぶ。

同値の条件に含めたいフィールドにチェックを入れる。

自動生成されるequalsメソッドのソースコード


オブジェクト比較の際の同一性、同値(等価)性についてまとめました。

初めの方にも触れましたが、equalsメソッドを定義した場合は合わせてhashCodeメソッドも定義する必要が出てきます。

hashCodeメソッドについてこちらの記事も合わせて読んでいただきたいと思います。

Follow me!

【Java】「同値」の定義はequalsメソッドをオーバーライドする” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください