- PR -

String#equals()を明示的に使うべきか?

投票結果総投票数:55
必ず使うべき 52 94.55%
使うべき 0 0.00%
使ったほうがいい 0 0.00%
場合による 1 1.82%
どちらでもいい 0 0.00%
使わなくていい 0 0.00%
使わないほうがいい 0 0.00%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-04-05 16:08
引用:

あぶぽんさんの書き込み (2007-04-05 15:58) より:
Objectの内容比較には必ずequals()などの比較メソッドを使うべきだと
信じてきましたが、比較的大規模なプロジェクトで大々的に使われているので
正直、驚きました。



比較的大規模なプロジェクトには比較的新人が投入されやすいので
むしろ探すと多く発見できるかもしれませんね
あぶぽんさんの発言からすると今回は意図的にやってたようですが…
いくらstatic finalな定数だったとしても一抹の不安がありますね。
むしろインライン展開されるstatic finalな定数だから余計に不安なのかも。

引用:

あぶぽんさんの書き込み (2007-04-05 15:58) より:
引用:

例外ケースとしてはString.intern()が確実に施されている状況ですね。
パフォーマンスチューニング上の必要があってやるのであればよいのですが、
素人が使うと火傷を負う代物のひとつかもしれません。


パフォーマンスに影響があるのは確かなのでしょうか?



そりゃぁもちろん。
たとえば100,000文字の長さからなる文字列の「値」が等しいことをチェックするには
どうしたらよいでしょう?
正解はString.equals()のソースコードを覗いてみてください。
Stringの「参照」の比較は常に一瞬で終えれますよね。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2007-04-05 16:41
nagiseさん、

引用:

あぶぽんさんの発言からすると今回は意図的にやってたようですが…
いくらstatic finalな定数だったとしても一抹の不安がありますね。
むしろインライン展開されるstatic finalな定数だから余計に不安なのかも。


意図的は意図的なんですが、それは
テストケースが通ったからであって、参照が同じになるという
確信があってのことではないので、そこが不安なのです。

引用:

たとえば100,000文字の長さからなる文字列の「値」が等しいことをチェックするには
どうしたらよいでしょう?
正解はString.equals()のソースコードを覗いてみてください。
Stringの「参照」の比較は常に一瞬で終えれますよね。


そのとおりですね。今回は比較的短い文字列だったのですが、
規約として許してしまうと長い文字列を書く人もいるでしょうから。。。

いづれにしても、定数を文字列にして、「==」で比較するというのは、
危険な賭けだと思います。

規約で許すべきではないですね。ね?

ログ運用は別の方法を考えるよう提言します。

今期からはJava5のenumが使えるので徹底します!
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-04-05 17:17
引用:

あぶぽんさんの書き込み (2007-04-05 15:58) より:

僕はC#については張りペタプログラマなのでよくわかりませんが、なぜ、「Equalsメソッドは使ってはいけない」なのでしょうか?


せっかく型の強い C# (.NET/CLR) を使っているのであれば、
タイプセーフでない Equals メソッドは使わない方が良いです。ご存知かと思いますが、NCL (.NET Framework Class Library) にある System.String クラスの
== 演算子は参照が比較されるのではなく、文字列の値が同じ内容かどうかが比較されます。

だから使わないのです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2007-04-05 17:36
自分でスレッド立てておいて、勝手なことを言わせてもらえるとしたら、

String#equals()は美しくないから使いたくない!

です。

演算子の多重定義は確かに問題が多かったですが、
「==」の多重定義(というか二重定義)はすべきだったと思います。

理由は、美しくないからです。

勝手なこと言ってすみません。。。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-04-05 17:59
引用:

あぶぽんさんの書き込み (2007-04-05 17:36) より:
String#equals()は美しくないから使いたくない!



そうすると参照の比較と値の比較で違う演算子が必要になりますね。
== と ===とでもしますか?
使い分けが必要なことは変わりますまい。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2007-04-05 18:10
nagiseさん、

引用:

そうすると参照の比較と値の比較で違う演算子が必要になりますね。
== と ===とでもしますか?
使い分けが必要なことは変わりますまい。



そこなんですよね。

C++やってたころはそう思ってたんですが、
参照の比較をすべきところって結構少ないと思うんです。

かと言って、すべて値の比較でいいか、値の比較しかできなくていいか
といわれると、ちょっと考えます。

しかし、equals()というメソッドにするというのは、
美しさという観点から考えるとやはり美しくないと思います。

許せる範囲かどうかは人によって違うかと思いますが、

今、目の前にある大量のソースコードを見て、
「全部、equals()に書き直せ!」と、大声ではいいづらいですね。

間違っててもキレイだから。。。ちゃんと動くし。。。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-04-05 18:21
引用:

あぶぽんさんの書き込み (2007-04-05 18:10) より:
しかし、equals()というメソッドにするというのは、
美しさという観点から考えるとやはり美しくないと思います。


演算子のオーバーロードを導入しますか?
多少便利になりますが、不要なまでの複雑さも導入してしまいます。

言語仕様の性格からして、理想主義なJavaと現実主義のC#。
どちらでも好きな方を選べばよいのではないでしょうか。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2007-04-05 18:39
あしゅさん、いつもありがとうございます。

理想主義的に言い換えると、

プリミティブ型とか参照型とかいう区別をなくしたい

というところでしょうか。

コード:
abu.state = "フニャフニャあたま";

if (abu.state.equals("フニャフニャあたま")) {
    abu.rest();
}



と書いてみたら、結構、美しい気もするのですが、
現実のコードに毒されてます。。。

※火をつけちゃいました

スキルアップ/キャリアアップ(JOB@IT)