次のようなコードフラグメントがあります。
List<EmailTemplate> langTemplates = emailTemplateMap.get(categoryId+"_"+languageId);
while (langTemplates.isEmpty() && altLanguageId <= Language.ALL.length)
{
langTemplates = emailTemplateMap.get(categoryId+"_"+altLanguageId);
altLanguageId++;
}
これは期待どおりに機能しません。私は(.classファイルを逆コンパイルして)、コンパイラが明らかにこれを次のように変更したことを発見しました:
List langTemplates;
for(langTemplates = (List)emailTemplateMap.get((new StringBuilder(String.valueOf(categoryId))).append("_").append(languageId).toString()); langTemplates.isEmpty() && altLanguageId <= Language.ALL.length; altLanguageId++)
{
langTemplates = (List)emailTemplateMap.get((new StringBuilder(String.valueOf(categoryId))).append("_").append(altLanguageId).toString());
}
これは同じではありません。実行中のエスケープ変数を置き換えただけです(幸運にも2番目の変数を取得しました。そうしないと、これは無限ループになります!)ループの前に定義されていたもので、常に同じ値をチェックし、更新を考慮しません/ループ内でローカル変数を再参照します。
これは意味がありますか?または、これはコンパイラのバグと見なすことができますか? そうでない場合、元のコードは間違っていますか?
洞察をありがとう。
マルク