2011-12-22 6 views
2

のための一般的な機能に正常な機能の変換しますコードレビューコメントがあります)、debugの条件がONでなくても、class文字列変換のオブジェクトが発生します。いくつかの場所では、これは望ましくないパフォーマンスの低下につながります。は、私は次のようにロギング機能を実装した最適化

if()の条件をどこにでも入れてコードを乱雑にしたくないのは、outputということだけですが、それ以外のことは繰り返されます。 Javaの機能を使用してこの問題を解決する最良の方法は何ですか?

私は、ジェネリックを使用して考える:

<T> void log (String output, T arg) 
{ 
    if(debug) 
    { 
    String val = <some string captured>; 
    Log.write("Logging: " + val + output + arg.toString(), this.handle); 
    } 
} 

は、このアプローチは、優れた最適化を行いますか?また、この汎用関数をエレガントに拡張して複数の引数を取ることはできますか?

答えて

4

は実際に、あなたもジェネリックを必要としない - あなたはObjectを使用することができます:あなたはたとえば、可変引数とMessageFormatを使用することができます

void log (String output, Object arg) { ... } 

複数のオブジェクトについては、次のように:

void log (String pattern, Object... args) { 
    if (debug) { 
     Log.write(MessageFormat.format(pattern, args)); 
    } 
} 

log("value is {0} {1}", str, val); 
+0

+1いい回答です。もう1つのクエリ: 'debug'条件がなければ、' log'関数が呼び出されます。私はそれについてもコードレビューのコメントを得ることができるのではないかと心配しています。関数呼び出しを保存することさえ時期尚早の最適化と言えるでしょうか? (注:関数は実行中に何度も呼び出されます) – iammilind

+0

@ iammilind:わかりません。典型的な方法は、関数呼び出しのまわりにデバッグ条件を置くことですが、何もしない関数を呼び出すことはパフォーマンスを著しく損なうものではありません。 – axtavt

+0

私は参照してください。ログが 'if()'条件で囲まれている典型的なアプローチを保持する方が良いでしょう。ありがとう。 – iammilind

関連する問題