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

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



 伊藤です。

ちょこっと横槍を入れさせていただきます。

On Fri, 31 May 2002 15:56:57 +0900
Murayama Toshikiyo <murayama@xxxxxxxxxxxxx> wrote:
> たしかにintern()はStringでのみ提供されているメソッドだと
> 思いますが,HashSetあたりを使えばそれと同等の処理を実装
> するのは難しくないと思います.それさえ実現すれば==はどの
> クラスのインスタンスでも使えるので実現可能なはずです.
<snip>
> つまり,どっちを使うかはあくまでアルゴリズムの問題であって,
> クラスによるものではないわけです.また「理解しやすい」という
> のは良い設計が備えるべき性質の一つではありますが,全てでは
> ありません.
前回の読書会の後、ソースコード及び仕様を確認してみました。
String以外のクラスでも似非コンスタントプールを実装することは
可能でしょうが、それでパフォーマンスの向上が図れるかというと
ケースバイ・ケースなのでしょうね。
#Stringは「コンパイル時」にコンスタントプールに格納することが
#可能なのでパフォーマンスは*ほぼ*必ず向上する。

その他の点を最適化しても残ったボトルネックが String.equals()で
ある場合にはアルゴリズムを工夫して String.equals()を ==で
置き換えることが出来るというのが元の話だったと理解しています。

福嶋さんが主張されているのはこのような話の流れの上で、equals()と
==を混ぜるのには反対だとことではないかと。もちろん自分も賛成です。
String.equals()を所によって ==で置き換えるには相当の勇気が
必要でしょう。

ただし、後ほど出てくる type-safe enumは Stringを定数として扱う
ことができるので ==で比較するのがしっくり来る。という目的も有って
==での比較を取り上げているのではないでしょうか?
p105でも以下のように書いてあります。
>タイプセーフ enumの小さな欠点は、タイプセーフenumは整数定数
>ではないので、switch文で使用できないことです。


> ちなみに,混乱するというのならクラスによって挙動が変化する
> equals()の方が混乱するのでは.Stringや数値以外では同値の
> 定義ができず,実質利用価値はないでしょう.それこそString
> 以外のクラスのインスタンスでequalsを積極的に利用した人
> なんて,ほとんどいないんじゃないでしょうか.これに対し
> ==の方はクラスに関係なく同じ動作をしますから,混乱する
> ことはないでしょう.
表現が混乱されているようですので、次の二つを区別して議論しましょう。
== :identical(一致)  二つの参照は同じインスタンスを指しているか?
equals():same(同値) 二つのインスタンスは同じ値であるか?

ここで ==の動作は文法的な挙動が決定されていますが、equalsは
意味的な実装をプログラマが決定する必要がありますね。
理想的な挙動はインスタンス同士の同値関係を確認することですが、
そうではないメソッドを実装しうるから混乱するのかもしれませんね。
村山さんもおっしゃっておりますが、XML文章、ノード(エレメント)
の同値関係も状況によってある程度異なるのは当然のことでしょう。

文字列の同値関係でもプログラマによっては定義が異なる場合があります。
結局、すべての同値関係は何と何が同値なのかを確認する必要がありますね。
#see java.text.Collator

p.s
String.intern()を使ったソースコードを見て勉強してみたいです。


-- 
Tetsu Ito <Tetsu_Ito@xxxxxxxxxxxx>