Есть ли способ повторно использовать объект Formatter в цикле? - PullRequest
3 голосов
/ 24 мая 2011

Есть ли способ повторно использовать Formatter в цикле, или мне просто создать экземпляр и позволить сборщику мусора разобраться с этим?(Это вопрос Java).Обратите внимание, что если я возьму экземпляр из цикла, к нему будет добавлено форматированное содержимое предыдущих итераций цикла.Formatter.flush () только кажется сброшенным, соответствует его названию и не дает преимущества повторного использования с чистого листа.

Пример:

for (...)
{
    Formatter f = new Formatter();
    f.format("%d %d\n", 1, 2);
    myMethod(f.toString());
}

Ответы [ 4 ]

9 голосов
/ 24 мая 2011

Вы можете использовать это так:

StringBuilder sb = new StringBuilder();
Formatter f = new Formatter(sb);

for (...)
{
    f.format("%d %d\n", 1, 2);
    myMethod(sb.toString());
    sb.setLength(0);
}

При этом будут повторно использоваться Formatter и StringBuilder, что может или не может повысить производительность в вашем случае использования.

1 голос
/ 24 мая 2011

Стандартная реализация Formatter является «состоящей из состояний», то есть при ее использовании изменяется внутреннее состояние. Это затрудняет повторное использование.

Есть несколько вариантов, которые вы можете попробовать:

  1. Если бы это был ваш код, вы можете добавить метод reset(), чтобы очистить внутреннее состояние. Недостаток: если вы забудете вызвать этот метод, произойдут плохие вещи.

  2. Вместо этого при изменении внутреннего состояния вы можете вернуть отформатированный результат в format(). Поскольку у вас больше нет внутреннего состояния, объект можно повторно использовать без метода reset(), что делает его более безопасным для использования

Но поскольку это стандартный API, его нельзя изменить.

Просто создайте новые объекты в цикле. Создание объектов в Java довольно дешево, и забывать о них ничего не стоит. Время, затрачиваемое на сборку мусора, зависит от количества живых объектов, а не от количества мертвых объектов, создаваемых вашим кодом. По сути, GC полностью игнорирует любые объекты, которые больше не связаны с другими объектами. Таким образом, даже если вы позвоните new миллиард раз в цикле, GC не заметит.

0 голосов
/ 24 мая 2011
for (...) {
    myMethod(String.format("%d %d\n", 1, 2));
}
0 голосов
/ 24 мая 2011

Просто создайте новый экземпляр и пусть старый соберет мусор.

...