編集 迅速な対応ありがとうございます。本当の質問が何であるかを見てください。今回は大胆にしました。
==と.equalsの違いは理解できます。だから、それは私の質問ではありません(私は実際にそのためのいくつかのコンテキストを追加しました)
空の文字列に対して以下の検証を実行しています。
if( "" == value ) {
// is empty string
}
以前は、dbから値をフェッチしたり、別のノードからオブジェクトを逆シリアル化したりしたときに、2つの文字列インスタンスが同じデータを含んでいたとしても、実際には異なるオブジェクト参照であったため、このテストは失敗しました。
したがって、これらの状況の修正は
if( "".equals( value ) ) {
// which returns true for all the empty strings
}
私はそれで大丈夫です。それははっきりと理解されています。
今日、これはもう一度起こりましたが、今回のアプリケーションはネットワークをまったく使用しない非常に小さなスタンドアロンアプリケーションであるため、データベースから新しい文字列がフェッチされたり、別のノードから脱セライズされたりすることはありません。
したがって、問題は次のとおりです。
その他の状況:
"" == value // yields false
と
"".equals( value ) // yields true
ローカルスタンドアロンアプリケーションの場合?
新しいString()がコードで使用されていないことは間違いありません。
そして、文字列参照が ""になる唯一の方法は、次のようにコード内で直接 ""が割り当てられているためです(またはそれが私が考えたものです)。
String a = "";
String b = a;
assert "" == b ; // this is true
どういうわけか(コードをもっと読んだ後、私は手がかりがあります)2つの異なる空の文字列オブジェクト参照が作成されました、私は方法を知りたいです
jjnguysの答えの行の詳細:
バイト!
編集:結論
私はその理由を見つけました。
jjnguyの提案の後、私はコードをさまざまな目で見ることができました。
有罪のメソッド:StringBuilder.toString()
新しいStringオブジェクトが割り当てられ、初期化されて、このオブジェクトによって現在表されている文字シーケンスが含まれます。
ドー!..。
StringBuilder b = new StringBuilder("h");
b.deleteCharAt( 0 );
System.out.println( "" == b.toString() ); // prints false
謎が解けた。
このコードは、StringBuilderを使用して、増え続ける文字列を処理します。ある時点で誰かがしたことが判明しました:
public void someAction( String string ) {
if( "" == string ) {
return;
}
deleteBankAccount( string );
}
と使用
someAction( myBuilder.toString() ); // bug introduced.
ps最近、CodingHorrorを読みすぎましたか?または、なぜここに面白い動物の写真を追加する必要があると感じるのですか?