argius note

プログラミング関連

"String==String"のお話

先日(8/8)のエントリを、Isoparametricさんに引用していただきました。
言語仕様をも変えてしまうなら、Stringだけじゃなくて、Objectも含めてそうしてしまうのが良かったかも。

if (o1 == o2) {
    // 内容が等しい場合
}

は、

// どちらかがnullなら常にfalseにしたい
if (o1 != null && o2 != null && o1.equals(o2)) {
    // 内容が等しい場合
}

の構文糖にして、従来のインスタンスが等しいかどうかは、

if (o1 sameinstanceas o2) {
    // インスタンスが等しい場合
}

とかにする。"==="にしようと思ったけど、タイプミスが頻発しそうなので。(とは言え、"sameinstanceas"は長すぎますね。"instanceof"に倣ってみたんですが。)

しかしながら、String.equals(String)はJavaに深く根ざしてしまっているので、いまさら変えようが無いでしょう。APIなら、今更"isEmpty()"が登場したように、言語仕様としての下位互換は保たれるので、前回のようなクラスメソッドがあれば、と思ったのです。というか、自分ではユーティリティでそれをやっています。

あと、たぶんバッドノウハウなのでおすすめしませんが、

if (String.valueOf(s1).equals(s2)) {
    // 同じ文字列
}

とすれば、NullPointerExceptionは回避できます。但し、s2が"null"という文字列だった場合は、trueになってしまうという欠点があります。