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

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



村山です.

> >  るといっている。それはその通りだと思うが、String以外の
> >  オブジェクトでそれができるとは限らない。そうすると、
> >  Stringの場合は"=="で比較するけど、Xxxxの場合はequals()で
> >  比較、とかになり、プログラマは混乱するのではないか?

ここで「String以外でできるとは限らない」ってのはどういう
レベルで言ってるんでしょう?
#「利用できるが実装するのが面倒だ」というのならまだ分かる.
#利用できないというのはおよそ考え難い.

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

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

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

> 私的には、「文字列の内容を比較したいのなら何も考えずに
> equals()を使えばいいじゃん」と思います。
あげ足を取るつもりはないですが,Stringの『内容』を比較したい
のなら==は使えないので,equals()を使うほかありません.もっとも
equals()自体は必ずしも内容を比較するメソッドではないですが.

「内容を比較するアルゴリズム」が本質的に遅く,もっと高速
なアルゴリズムに変更しなければならない場合も出てくる.その
常套手段がintern()と==を使う方式というだけで,その他のやり方
をしちゃいけないわけではない.本質はアルゴリズムの最適化で
あって,内容の比較から参照の比較への置き換えというのは,
その実現法の一つに過ぎません.

> そういや、デシリアライズで発生したStringオブジェクトって、
> intern()されるんでしたっけ?
#されないからこそ,偽者が発生するという話なのでは.
#やりたければプログラマーが明示的に宣言するんでしょう.

---
>明らかにcomposite複合クラス同士の比較は手作りのequals()
>でなければ実現不可能ですから。

equals()はデフォルト実装("==")でも特に問題ないはずですが.

あえて==以外の同値関係を定義する場合には,equals()をオーバー
ライドする必要があるだけです.それに,利用しない場合には
わざわざそうする必要もないでしょう.

それに,実際問題としてあまりに複雑なインスタンス同士の
「同値」は容易には定義できない場合が多いのでは.
#そう言えば,XML文書の同値関係って定義されてましたっけ?
#CanonicalXMLとかXML information setあたりがそれ関係の
#仕様だと思うけど把握し切れてないし,残念ながら標準と
#いうわけでもない.

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