我已经实现了以下日志记录功能:
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
条件不为ON,也会发生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);
}
}
这种方法会做出很好的优化吗?另外,我可以优雅地扩展这个泛型函数以获取多个参数吗?
答案 0 :(得分:4)
实际上,您甚至不需要泛型 - 您可以使用Object
:
void log (String output, Object arg) { ... }
对于多个对象,您可以使用varargs和MessageFormat
,例如,如下所示:
void log (String pattern, Object... args) {
if (debug) {
Log.write(MessageFormat.format(pattern, args));
}
}
log("value is {0} {1}", str, val);
答案 1 :(得分:2)
实际上我不明白在你的情况下使用泛型的原因。只需使用varargs(查看http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html)和字符串格式(String.format)。
或者使用现有的日志记录库,例如log5j:http://code.google.com/p/log5j/