- PR -

文字列の比較

投稿者投稿内容
てんきゅう
会議室デビュー日: 2003/04/10
投稿数: 3
お住まい・勤務地: 埼玉県・新宿
投稿日時: 2003-05-01 14:38
はじめまして、いつも見てばっかですが
今回はじめて投稿させていただきます。
今後、私にわかることがありましたら
いろいろと投稿したいと思いますので
今後ともよろしくお願いします。


JAVAのコーディングで、文字列(string型)の比較し、
NULLもしくは空白の場合は処理を変えるということをやりたいと思い、
下記の2つの方法を考えました。
状況的には、NULL空白では処理を続けることができないため
その前に判定をし、NULL空白の場合は処理を抜けるような
コーディングをしています。
この2つではどちらかが良くどちらかが悪いと言うことが
あるのでしょうか?
また、他にも良い方法はありますでしょうか?


・方法1
if( string == null || string.equals("") ){
// NULL or 空白の場合の処理
}


・方法2
if( string == null || string.length() < 1 ) {
// NULL or 空白の場合の処理
}

以上、よろしくお願いします。

yuzy
大ベテラン
会議室デビュー日: 2002/02/14
投稿数: 117
投稿日時: 2003-05-01 16:10
JDKのStringクラスのソースコードを見れば、どちらがよいかわかります。

答えは length() を利用する方です。
理由はソースを眺めてください。
mikan
ベテラン
会議室デビュー日: 2002/08/19
投稿数: 58
投稿日時: 2003-05-01 17:01
Stringクラスの実装を読んでしまうと、方法2のほうが速いのかなと思ってしまうんですが、方法1のほうがやっていること(やりたいこと)が直感的にわかりやすいと思います。
(もちろん、「length()<1」を直感で「equals("")」と読める人もいるでしょうけどね)

string.equals("") の呼び出しが return false に達するまでの数ステップがどれくらいの影響なのかは知りませんが、個人的には1でいいんじゃないかなぁと思ったりします。

#でも2を否定するわけじゃないですよ。
tabby
ベテラン
会議室デビュー日: 2002/06/26
投稿数: 55
お住まい・勤務地: 埼玉県・東京都
投稿日時: 2003-05-01 17:02
マイナスの値はないので length() == 0 のほうが微妙に早いかも
maru
常連さん
会議室デビュー日: 2001/10/09
投稿数: 23
投稿日時: 2003-05-01 17:21
どちらの実装にするにしろ
意味のわかりやすい名称をつけて
IsNullみたいなメソッドにしておくと良いのではないでしょうか
(リファクタリング参照)
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-05-01 18:34
unibon です。こんにちわ。

引用:

てんきゅうさんの書き込み (2003-05-01 14:38) より:
・方法1
if( string == null || string.equals("") ){
// NULL or 空白の場合の処理
}


・方法2
if( string == null || string.length() < 1 ) {
// NULL or 空白の場合の処理
}


あと、
if (string == null || string.compareTo("") == 0) {
}
も見かけることがあります。

(なお、この手の議論では、
if (string == null || string == "") {
}
でも良いのでは/いや良くないのでは、という話も出るかもしれませんが、
これは別の問題に落としこめると思いますので、ここでは省きます。)

ちなみに細かいですが、「方法2」は、数値 1 との比較ではなく、
0 と比較すべきのように感じます。
if( string == null || string.length() <= 0 )
や、あるいは length が負になることはないということを考慮して
if( string == null || string.length() == 0 )
のような感じです。
#数値 1 に意味がない(0 かどうかが重要である)、という立場で見た場合です。

以上、いろいろ書いたのですが、
こういうのは、どうでもいいや、というのが率直な感想です。
議論を否定するわけではぜんぜんないのですが、
いくつかのバリエーションがあっても、
コードを読むときに頭の中で等価だとみなしてしまえばそれで良いと思います。
将来、なんらかの自動化ツールを使って後からフォーマットし直せる可能性が高いことも、
こう思う一因です(たぶんそんなに難しくないですよね)。

もっとも、表記を一通りに統一できればそれに越したことはないのですが、
現実には無理だと思うためです。
私ひとりでコーディングしていても、なぜかいつのまにか、
複数の方法が混じってしまっています(これが変?)。
また、私の好みも多いですが、実行時の速さよりも見易さや統一性を重視したいと思います。
#が、上述のように、あまり気にしない。

#あえて最後に書きますが、好みが大きい要因である問題だと思います。
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2003-05-02 14:01
私は
if (string == null || string == "") {
このような記述を見つけたら怒り出します。

で、本題ですが。

if( string == null || string.length() == 0 )
がお勧めですしisNULL()実装してもいいと思います。

たとえばstaticなメソッドにしてこのように書くとか
if ( StringHelper.isNULL( string ) )

で追加で1箇所だけこう書くこともできるようになりますから。
if( StringHelper.isNULL( string ) || string.trim().length() == 0 )
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-05-06 10:40
unibon です。こんにちわ。

引用:

zaxx_MDさんの書き込み (2003-05-02 14:01) より:
たとえばstaticなメソッドにしてこのように書くとか
if ( StringHelper.isNULL( string ) )

で追加で1箇所だけこう書くこともできるようになりますから。
if( StringHelper.isNULL( string ) || string.trim().length() == 0 )


以下、好みの影響が多分にあると思いますが、
上記のような StringHelper.isNULL メソッドを使うと、
第三者がコードを見たときに、毎回 StringHelper.isNULL メソッドの定義を気にする必要が出てきます。

おそらく isNULL と名づけられたメソッドの挙動は、
コード:
public static boolean isNULL(String s) {
    return s == null;
}


であろうと思われますが、もしかしたら
コード:
public static boolean isNULL(String s) {
    return (s == null) || (s.length() == 0);
}


のようになっているかもしれない、と懸念してしまうからです
(この逆もあり。結局どっちかはパッと見だけでは分からない)。
これならわざわざ isNULL でまとめないほうが、
そういう懸念がなくて良いと思うためです。
StringHelper クラスを普遍的なものとして扱える強固なフレームワークがあれば良いのですが、
それがなかなか大変です。

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