有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

这种方法能很好地进行优化吗?另外,我可以优雅地扩展这个泛型函数以接受多个参数吗


共 (2) 个答案

  1. # 2 楼答案

    实际上,你甚至不需要泛型——你可以使用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);