2

次のようなjavautilloggingステートメントがある場合

logger.log(LEVEL.FINE, "data buffer = {0}", 
CommonUtils.prepareDataBufferString(dataBuffer));

これで、ログレベルがFINEにない場合でも、高価なprepare ..メソッドが呼び出されますが、これは私が望んでいることではありません。このステートメントの前にロガーレベルをチェックすることになります

if(logger.isLoggable(LEVEL.FINE)){
   bufferString = CommonUtils.prepareDataBufferString(dataBuffer);
}

logger.log(LEVEL.FINE, "data buffer = {0}", bufferString);

これにより、コードの行が不必要に増えます。どういうわけかこれをする必要を避けることができますか?助けてください。

4

2 に答える 2

4

このようなテクニックが役立つかもしれません。

logger.log(LEVEL.FINE, "data buffer = {0}", 
    new Object() {
        @Override public String toString() {
            return CommonUtils.prepareDataBufferString(dataBuffer));
        }
    });

参考までに、メソッドを呼び出すのはログフレームワークではなく、Javaです。Javaでは、メソッドを呼び出す前に、メソッドのすべてのパラメーターを評価する必要があります(これは、遅延評価とは対照的に、先行評価と呼ばれます)。

于 2012-11-16T23:12:37.857 に答える
2

いいえ、私が知っているJavaロギングAPIでは回避できません。あなたが望むことをするための言語には本当に2つの方法しかありません:

  1. あなたが説明するifステートメント
  2. インターフェイスを実装するオブジェクトをAPIに渡して、詳細を生成します。

私が知っているロギングAPIは実装されていません(2)。匿名オブジェクトを渡す方が冗長ではないかどうかはわかりません。

于 2012-11-16T23:07:22.797 に答える