2011-12-22 69 views
2

我已经建立了一个记录功能如下:转换一个正常功能的通用功能,用于优化

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

log在几个地方如被使用,

log("value is " + str + " " + val); // 'str','val' can be a string or class with '.toString()' 
log("error: " + e1 + ". Exiting."); // 'e1' can be a class with overloaded '.tostring()' 

现在的问题是(作为代码评论评论),即使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

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

多个对象,你可以使用可变参数和MessageFormat,例如,如下:

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

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

+1好的答案。还有一个查询:没有'debug'条件,仍然会调用'log'函数。我担心,我也可以获得代码评论评论。我可以告诉他们,即使保存一个函数调用也是不成熟的优化吗? (注意:执行时多次调用函数) – iammilind 2011-12-22 09:29:07

+0

@iammilind:我不知道。典型的方法是在函数调用周围放置调试条件,尽管调用不执行任何操作的函数不应该严重影响性能。 – axtavt 2011-12-22 09:49:49

+0

我明白了。最好保留典型的方法,其中日志包含在'if()'条件中。谢谢。 – iammilind 2011-12-22 09:56:51