有没有办法在循环中重用Formatter对象?

时间:2011-05-24 08:16:30

标签: java formatter

有没有办法在循环中重用Formatter或者我只是实例化并让垃圾收集器处理它? (这是一个Java问题)。请注意,如果我将实例化从循环中取出,则循环中先前迭代的格式化内容将被附加到。 Formatter.flush()似乎只是刷新,与其名称相同,并且没有提供允许重复使用干净的平板的好处。

示例:

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

4 个答案:

答案 0 :(得分:9)

您可以像这样使用它:

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 :(得分:1)

Formatter的标准实现是“有状态的”,即使用它改变一些内部状态。这使得重用变得更加困难。

您可以尝试以下几个选项:

  1. 如果是您的代码,您可以添加reset()方法来清除内部状态。缺点:如果你忘记调用这种方法,就会发生不好的事情。

  2. 相反,如果更改内部状态,您可以在format()中返回格式化结果。由于您不再具有内部状态,因此可以在没有reset()方法的情况下重复使用该对象,这样可以更安全地使用

  3. 但由于这是一个标准的API,你无法改变它。

    只需在循环中创建新对象即可。用Java创建对象非常便宜,忘记它们并不需要花费任何成本。在垃圾收集中花费的时间是相对于活动对象的数量,而不是代码生成的死亡数量。基本上,GC完全无视任何未连接到任何其他对象的对象。因此,即使您在循环中调用new十亿次,GC也不会注意到。

答案 2 :(得分:0)

只是实例化一个新的,并让旧的垃圾收集。

答案 3 :(得分:0)

for (...) {
    myMethod(String.format("%d %d\n", 1, 2));
}