文字列比較を == して死亡どころか大爆死

public boolena empty(String s)
{
  return (s == null) || (s == "");
}

なんてJavaで書いちゃって死亡。 後者は "".equals(s) が正しいですね。すいませんマジすいませんでした。おのれJava!!



とはいえ、JUnitでテストした関数だったんですよ。 問題ないじゃーんと。

assertTrue(empty(null)); // OK!
assertTrue(empty(""));   // OK!

ですが、この empty() を本番コードで以下のように使っていました(イメージ)

final String   csvData = ",,,"; // テストで空カラムデータを投げた
final String[] cols    = csvData.split(",");
if(empty(cols[0])) return false;
if(empty(cols[1])) return false;
if(empty(cols[2])) return false;
  :
  :

ステップオーバーで if() を素通りする姿に 10秒ぐらい頭真っ白になったね! そうだよね! コード直書きの空文字 "" のインスタンスは同じ可能性があるけど、split() して誕生した空文字 "" はインスタンスまず別だよね! そりゃ false だよね!

…いやーもうなんか恥ずかしい。 おのれJava!!