将普通函数转换为泛型函数以进行优化

时间:2011-12-22 09:08:52

标签: java generics optimization logging

我已经实现了以下日志记录功能:

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);
  }
}

这种方法会做出很好的优化吗?另外,我可以优雅地扩展这个泛型函数以获取多个参数吗?

2 个答案:

答案 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/