[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10164] Re: equals() と ==



福嶋です。

On Fri, 31 May 2002 15:56:57 +0900, according to the article
"[jfriends-ml 10163] Re: equals() と =="
Murayama Toshikiyo <murayama@xxxxxxxxxxxxx> wrote:

> > >  るといっている。それはその通りだと思うが、String以外の
> > >  オブジェクトでそれができるとは限らない。そうすると、
> > >  Stringの場合は"=="で比較するけど、Xxxxの場合はequals()で
> > >  比較、とかになり、プログラマは混乱するのではないか?
> 
> ここで「String以外でできるとは限らない」ってのはどういう
> レベルで言ってるんでしょう?
> #「利用できるが実装するのが面倒だ」というのならまだ分かる.
> #利用できないというのはおよそ考え難い.

例えば、他のモジュールで生成されたインスタンスを利用するような場合、
自分のモジュールからはすべてのインスタンスを参照できませんから、equals()
による同値関係の比較が必要になるケースがあるのではないでしょうか。
ServletやServletContextなど。
(これらを比較するような必要があるかどうかは謎ですが)

実際、レアケースなのかもしれませんが。

> たしかにintern()はStringでのみ提供されているメソッドだと
> 思いますが,HashSetあたりを使えばそれと同等の処理を実装
> するのは難しくないと思います.それさえ実現すれば==はどの
> クラスのインスタンスでも使えるので実現可能なはずです.
> #コレクションフレームワークはいまいち理解しきれてないので
> #間違ってる可能性はある.とはいえ,HashSetが使えなくても,
> #intern()と同等のメソッドを実現するのはさほど難しくは
> #ないと思う.それだけ敷居が高くなるのは事実だが.

自前で管理となると大変そうですね。
メモリ使用量も増えそうな気がします。
(無責任な発言ですみません)

> つまり,どっちを使うかはあくまでアルゴリズムの問題であって,
> クラスによるものではないわけです.また「理解しやすい」という
> のは良い設計が備えるべき性質の一つではありますが,全てでは
> ありません.というより,現実問題として「理解しやすさ」だけ
> を基準にアルゴリズムを選択している人って,一体どのくらい
> いるんでしょう?

おっしゃる通り、「理解しやすさ」は1つの性質であり、すべてではないと
思います。ただし、特にチームで開発する場合は重要な要素になると考えて
います。

> ちなみに,混乱するというのならクラスによって挙動が変化する
> equals()の方が混乱するのでは.Stringや数値以外では同値の
> 定義ができず,実質利用価値はないでしょう.それこそString
> 以外のクラスのインスタンスでequalsを積極的に利用した人
> なんて,ほとんどいないんじゃないでしょうか.これに対し
> ==の方はクラスに関係なく同じ動作をしますから,混乱する
> ことはないでしょう.

Effective Java の本にも書かれている通り、equals()は遵守すべき「契約」が
あるため、この「契約」が守られているもの、と捉えられれば「挙動が変化する」
とは考えなくてよいのではないでしょうか。
例えば、equals()は同値関係にある稼動かを判定するメソッド、と捉えるとか。

「Stringや数値以外での定義ができず」とはどういうことでしょうか?
私はStringや数値以外のクラスにもequals()は書くことはあります。特に、
コレクション関連のクラスに入れるようなオブジェクトには書くことが多いです。

> #冗長な空白文字やコメントの有無という程度の,意味的に同じ
> #だが異なる二つのXML文書では,equals()で返すのは真と偽の
> #どちらにすべきでしょう?

それは使い方(状況)によるのではないでしょうか。
目で見た時の内容が同じであればよい、という判断であれば真を返すし、
ファイルが更新されたかどうかの判断であれば偽を返すのでしょう。

----------------------------------------
(株)PFU ソフトプロダクト事業部第二開発部
  福嶋 航  w.fukushima@xxxxxxxxxxxxxxx