ネタ元:if条件判定はどちらがよい?(以前のブログエントリ(古い))
:文字列をequalsで判定する時(@IT)
いままで、僕は以前のブログに書いてあるように、
if(変数.equals("定数"))
のほうが、
if("定数".equals(変数))
より保守の観点では優れていると思っていました。
しかし、この考えが120度くらい変わってしまったので、
再エントリをすることにしました。
どちらのケースでも
nullの対応がきちんと行われているのであれば、それほど問題となりません。
しかし実際にはnullの考慮をし忘れて、不具合となるケースが少なくありません。
以前までの僕は、以下のように考えていました。
if(変数.equals("定数"))
を使用していれば、その箇所でNullPointerExceptionが発生するため安全です。
if("定数".equals(変数))
を使用してしまうと、nullの場合に処理をしないだけなので、
処理は正常に動作し、最悪の不具合の場合にはデータの破損や、
不具合箇所の特定が困難になります。
そして以下が考えを改めた理由です。
単純に
if(変数.equals("定数"))と使用していれば、
上記のようにバグはその時点でNullPointerExceptionが発生し問題ありません。
しかし多くの場合は、
if(変数!=null && 変数.equals("定数"))
と書かかれています。
まるで、枕詞のように頻繁に。
であるならば、
この書き方は、
if("定数".equals(変数))
と等しく、以前までの僕が懸念してきたことは、
まったく意味のないものとなってしまいます。
どちらの場合でも同じような懸念が残ってしまうのです。
意図的に
「変数!=nullを使わないようにし、変数.equals("定数")のみで記述するようにすれば・・・」
とも思いましたが、
そもそも意図的に「変数!=nullを使わない」部分に気をつけるのであれば、
「null時の対応を考慮し忘わすれない」部分に気をつけるべきなのだろうと考えました。
if(変数.equals("定数"))と
if("定数".equals(変数))を
比較したとき、
今までの考えと変わらず前者が安全だと思っています。
しかし
if(変数!=null && 変数.equals("定数"))と
if("定数".equals(変数))を
比較したとき、
後者のほうが分かりやすいと、僕は考えます。
考えた末出した結論は、
ケースバイケースで。
・・・
・・・
結論になってないですね。
どちらにしろ、この手の記述がある際には
その状況などを考慮し注意する必要があるぞと、
胸の奥にとどめておく程度でよいかと思います。