2012-08-10 19 views
9

考慮下面的代碼:NumberFormat.getInstance保證能夠創建一個新的實例嗎?

NumberFormat format = NumberFormat.getInstance(); 
format.setMinimumFractionDigits(spotDecimalPlaces); 
format.setMaximumFractionDigits(spotDecimalPlaces); 

是否 「安全」?是否NumberFormat.getInstance()保證每次都返回一個新的NumberFormat對象?

或者有可能getInstance()返回相同的實例嗎? (在這種情況下,該代碼會影響其他地方在發生這種情況使用getInstance的JVM ...)

查看源代碼,它似乎它每次都返回一個新的實例。 JavaDoc在這個問題上令人沮喪地模糊。

如果上面的代碼真的是「安全的」,那麼在我看來,getInstance()是這個方法的一個可憐的名字 - 它應該被稱爲createInstance()

NumberFormat.getInstance()保證總是返回一個新的實例嗎?

+0

如果它是模糊的話,我會不依賴於它在所有 – 2012-08-10 10:59:02

+0

是可以說是最強大的東西做的是創建一個新的DecimalFormat。我真的不希望當前的「語言環境」在任何情況下影響行爲...... – 2012-08-10 11:13:41

回答

8

是的,它是安全的。該代碼要麼從NumberFormatProvider(必須根據文檔返回一個新實例)獲取實例,要麼創建DecimalFormat的新實例。

從邏輯上講,因爲NumberFormat是可變的,返回相同的實例或高速緩存的實例會使方法完全無法使用。

+0

如何獲得NumberFormatProvider? – Edmondo1984 2017-12-09 13:08:46

+0

@ Edmondo1984你不知道。但NumberFormat.getInstance在內部執行。 – 2017-12-09 13:31:36

+0

您得到的實例在解析方面不安全 – Edmondo1984 2017-12-09 13:34:38

2

NumberFormat page

同步

數字格式通常不同步。建議 爲每個線程創建單獨的格式實例。如果多個線程 同時訪問一個格式,它必須在外部同步。

這個間接表明該方法創建一個新的實例與每個調用。因爲,由於NumberFormat不是線程安全的,否則它將不可用。

2

命名,我更喜歡

  • newXxxxcreateXxxx創建新實例每次。
  • getXxxx爲您提供了一個實例,如果它已經存在但不會創建一個實例。
  • acquireXxxxvalueOf根據需要創建一個,可能會或可能不會是新的。

在這種情況下,它就像Calendar.getInstance()每次都會創建一個新實例。

0

例子: -

ClassA a = new ClassA(NumberFormat.getInstance(Locale.GERMAN)); 

的NumberFormat的正常使用:

NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);  
         nf.setMinimumFractionDigits(2); 
         nf.setMinimumIntegerDigits(1); 
         nf.setGroupingUsed(true); 



        java.lang.Number num = nf.parse(Preis); 
+0

我猜這是來自某些文檔的引用,並且我的格式適當。如果我錯了,應該刪除blockquote。 – 2013-05-14 18:37:35

相關問題