かつのりの日記2

わんくまでは珍しいJavaを中心とした日記です

目次

Blog 利用状況

書庫

日記カテゴリ

いろいろリンク

equalsの実装

javaによるequalsの基本的な実装について。

意外と面倒なんですが、このequalsメソッドの実装パターンは一番よく使うかと思います。

まず、自分自身と入力が同じであるかを比較します。同一のインスタンスであれば同じであることは明確ですので、最初に呼び出してパフォーマンスアップです。

これはString等でも利用されている方式となります。例えば、"aaa".equals(" aaa ".trim())はtrueになりますが、この場合最初の同一チェックでfalseとなるため、同値チェックが行われます。これが"aaa".equals("aaa")なら同値チェックの前に同一チェックでtrueとされます。この場合かなり高速な比較となります。String#intern()が一番輝くケースですね。

で、次にnullチェックです。比較対象がnullならば紛れもなくfalseです。そして型チェック。型の互換性がないならそもそも同値ではありません。instanceof演算子は左辺がnullならfalseになるので、nullチェックと型チェックが同時に出来ます。

型チェックが済めば安全にキャストができ、その後のチェックは機械的に行います。

この手法なら、あんまり難しいことを考えずに、高速で安全なequalsのオーバーライドができるのです。

投稿日時 : 2007年8月23日 2:22

Feedback

# re: equalsの実装 2007/08/23 11:56 凪瀬

いっそEclipseでそういうテンプレートがあればいいのに。
というか、なんかやればできるのかな?

# re: equalsの実装 2007/08/23 12:05 かつのり

Eclipseにありますよ。3.2からかな・・・
Javaエディタ上で右クリックして、
[ソース]>[hashCode()及びequals()の生成]でできますが、
生成されるコードはちょっと微妙です。

# re: equalsの実装 2007/08/23 13:42 凪瀬

おぉ。気づいてませんでした。こんな機能あったんだw

コードスタイルあたりで生成コード変えれるのかと思ったら変えられないなぁ。

# re: equalsの実装 2007/08/23 15:13 かつのり

>コードスタイルあたりで生成コード変えれるのかと思ったら変えられないなぁ。
なので、自分は使ってません・・・
生成されるコードはイマイチ気持ち悪いw

プラグインでCommons Lang用のコードを生成してくれるのがありますが、
そっちの方が便利かもしれませんね。

タイトル
名前
Url
コメント