if( 文字列定数.equals( 変数 ){
}
と
if( 変数.equals( 文字列定数 ){
}
書き方の違う2つの似たif文がありますが、
どちらが保守に強い書き方なのでしょうか。
2つの動作の大きな違いとして、
前者はNullPointerExceptionは発生しないが、
後者はNullPointerExceptionは発生する可能性があります。
前者の場合は、変数にたとえNullが入っていたとしても、処理を継続します。
実行時エラーは発生しません。(少なくともこの段階では))
Nullの場合はそもそも意図した処理をする必要がないため、
Nullであろうがなんだろうが気にしません。
後者の場合は、変数にNullが入ってきた場合の処理を考える必要があります。
NullPointerExceptionを投げられたら嫌ですもん。
ですから、通常Nullである可能性がある場合は、
if( 変数 != null && 変数.equals( 文字列定数 ) ){
}
と言ったような書き方をします。
上記のような書き方は、実はどちらもNullを考慮したつくりになっています。
Nullが入ってくることを許容したつくりですね。
その場合は確かに前者の方が優れているといえそうです。
次にNullを許容していない場合を考えてみます。
前者の場合は、Nullを許容してしまっているので、処理はされませんがエラーにもなりません。
実行時エラーを出さないのも大切ですが、
意図しない結果をエンドユーザに出力してしまうほうが問題です。
エラーとならないので、最終的な処理結果が意図していたものと違うかどうかが分からず
障害が発生した場合のエラー箇所の特定が困難になります。
#まあ言ってしまえば前者自体がバグなのですが。
後者の場合は、NullPointerExceptionを投げます。
例外を投げるので、エラー箇所を特定することも容易です。
ここより前の段階で何かしらの理由で変数にNullが含まれたことが明らかだからです。
?
結論として、どちらのif文を使用するかはケースバイケースと言うことになりますが、
状況によりどちらのケースが適切であるかを考えるよりも
Nullの許容有無に関わらず使用できる後者ほうが、保守に強いといえるかもしれません。