Преобразование нормальной функции в общую функцию для оптимизации - PullRequest
2 голосов
/ 22 декабря 2011

Я реализовал функцию ведения журнала следующим образом:

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 ]

4 голосов
/ 22 декабря 2011

На самом деле, вам даже не нужны генерики - вы можете использовать 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);  
2 голосов
/ 22 декабря 2011

На самом деле я не понимаю причину использования дженериков в вашем случае. Просто используйте varargs (смотрите http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html) и форматирование строки (String.format).

Или используйте существующие библиотеки журналов, такие как log5j: http://code.google.com/p/log5j/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...