java将普通函数转换为通用函数进行优化
我实现了一个日志功能,如下所示:
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()'
现在,问题是(以代码评审注释的形式获得)class
对象到字符串的转换将发生,即使debug
条件未启用。在一些地方,这将导致不必要的性能降级
我不想把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);
}
}
这种方法能很好地进行优化吗?另外,我可以优雅地扩展这个泛型函数以接受多个参数吗
# 1 楼答案
事实上,我不明白在你的案例中使用泛型的原因。只需使用varargs(lookhttp://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html)和字符串格式(string.format)
或者使用现有的日志库,比如log5j:http://code.google.com/p/log5j/
# 2 楼答案
实际上,你甚至不需要泛型——你可以使用
Object
:例如,对于多个对象,可以使用varargs和
MessageFormat
,如下所示: