2011-05-24 65 views
3

有沒有辦法在循環中重用格式化程序,或者我是否只是實例化並讓垃圾回收器處理它? (這是一個Java問題)。請注意,如果我將實例化從循環中取出,則循環中先前迭代的格式化內容將被附加到。 Formatter.flush()只能看起來是flush,不如它的名字真實,並沒有給出一個乾淨的slate重用的好處。有沒有辦法在循環中重新使用Formatter對象?

例子:

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

回答

9

你可以使用這樣的:

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

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

這將重用格式化和StringBuilder的,這可能會或可能不適合您的使用情況下的性能增益。

0

只是實例化一個新的,讓老一送垃圾收集。

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

但是我們真的知道是否有重複使用? – H2ONaCl 2011-05-24 08:29:21

1

的標準實現的Formatter是「全狀態」,即使用它改變了一些內部狀態。這使得難以重用。

有幾個選項,你可以嘗試:

  1. 如果這是你的代碼,你可以添加一個reset()方法來清除內部狀態。缺點:如果你忘記調用這個方法,就會發生不好的事情。

  2. 而是如果更改內部狀態,則可以返回格式化結果format()。既然你沒有內部狀態了,對象可以在沒有reset()方法,這使得它更加安全地使用

但因爲這是一個標準的API,你不能改變它可以重複使用。

只需在循環中創建新對象。用Java創建對象相當便宜,忘記它們不需要花費任何東西。花費在垃圾收集上的時間與生命對象的數量有關,而不是代碼產生的死亡數量。基本上,GC完全無視任何不再與任何其他物體連接的物體。所以即使你在迴路中撥打new十億次,GC也不會注意到。

+0

我猜他正在使用Java內建的'Formatter',因此添加'reset()'方法並不是真正的選擇。 – Waldheinz 2011-05-24 08:52:51

+0

我想知道爲什麼我從來沒有使用這個類,但後來我看着API,它在我身上曙光...... ;-) – 2011-05-24 08:54:32

+0

@AaronDigulla因爲你寫這個我一直想知道爲什麼你不使用java.util .Formatter。您可以使用相同的對象格式化和追加。這似乎比這種嵌套'StringBuilder.append(String.format(「%d%f」,x,y));'我在這裏誤解了什麼? – H2ONaCl 2011-10-24 10:10:01

相關問題