1

次のステートメントを検討してください。ログ レベルは ERROR に設定されています。使用されているロギング API は log4j です。上記の情報が与えられた場合、いくつの文字列が作成されますか?

if (logger.isDebugEnabled()) {
    logger.debug("Executing SQL query [" + sql + "]");
}

他の質問は

if (logger.isDebugEnabled()) {
     StringBuilder sBuilder = new StringBuilder("Executing SQL query [");
     sBuilder.append(sql);
     sBuilder.append("]");
     logger.debug(sBuilder.toString());
}

上記の場合、いくつの文字列が作成されますか?

私の質問は、ロガーがデバッグ用に有効になっていない場合でも、コンパイラーは文字列を作成しますか?

4

2 に答える 2

2
logger.debug("Executing SQL query [" + sql + "]");

2本の弦

"Executing SQL query [" 

"]"

コンパイル時に作成されます。

そして、実行時に、

"Executing SQL query [" + sql + "]"

(+) 演算子は、ヒープ メモリに新しい StringインスタンスJVMを作成する new StringBuilder(string...).toString() を返します。

追加操作はStringBuilder.toString、デバッグが有効な場合に発生します。

于 2013-10-29T09:34:21.123 に答える
2

ソース コードに引用符がある場合、コードがどれほど複雑であっても、コンパイラは文字列定数をプールに入れます。コンパイラは、コードに到達できないことが明確にわかる場合 ( などif(false)) を除いて、多くの仮定を行いません。

書き込みを可能にする logback を使用して slf4j を確認することをお勧めします。

log.debug("Executing SQL query [{}]", sql);

実行時には、引き続き を作成しStringBuilder、パターンと引数から結果をビルドしますが、slf4j が自動的に実行することに注意しifてください。これにより、多くの労力を費やすことなく、コードをクリーンで高速に保つことができます。

プロジェクト Lombokとその@Log アノテーションを見て、さらに簡単でコンパクトにすることをお勧めします。

于 2013-10-29T10:46:49.573 に答える