2012-08-10 10 views
9

Rozważmy następujący kod:Czy NumberFormat.getInstance gwarantuje utworzenie nowej instancji?

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

Is It "bezpieczne"? Czy za każdym razem NumberFormat.getInstance() gwarantuje zwrócenie nowego obiektu NumberFormat?

Czy istnieje możliwość, że getInstance() zwróci to samo wystąpienie? (W tym przypadku ten kod wpłynęłoby wszędzie indziej na JVM, co dzieje się w użyciu getInstance ...)

Patrząc na kod źródłowy to wydaje jak zwraca nową instancję za każdym razem. JavaDoc jest frustrująco niewyraźny w tej sprawie.

Jeśli powyższy kod naprawdę jest "bezpieczny", to wydaje mi się, że getInstance() jest złą nazwą dla tej metody - że powinien on był nazywać się createInstance().

Czy NumberFormat.getInstance() jest gwarantowane, że zawsze zwraca nowe wystąpienie?

+0

Jeśli jest niejasne wtedy nie będę polegać na nim w ogóle –

+0

Tak zapewne najbardziej solidnych rzeczy do do to jest utworzenie nowego DecimalFormat. Naprawdę nie chcę, aby obecne "locale" wpłynęło na zachowanie w każdym przypadku ... –

Odpowiedz

8

Tak, to jest bezpieczne. Kod otrzymuje instancję z NumberFormatProvider (która musi, zgodnie z dokumentacją, zwrócić nową instancję), lub tworzy nową instancję z DecimalFormat.

Logicznie, ponieważ NumberFormat jest zmienna, zwrócenie tej samej instancji lub wystąpień z pamięci podręcznej spowodowałoby, że metoda ta byłaby całkowicie bezużyteczna.

+0

Jak uzyskać NumberFormatProvider? – Edmondo1984

+0

@ Edmondo1984 Nie. Ale NumberFormat.getInstance robi wewnętrznie. –

+0

Wystąpienie nie jest bezpieczne w odniesieniu do przetwarzania – Edmondo1984

2

Z NumberFormat page

Synchronizacja

formaty liczb na ogół nie są zsynchronizowane. Zaleca się, aby utworzyć osobne instancje formatu dla każdego wątku. Jeśli wiele wątków ma równoczesny dostęp do formatu, musi być zsynchronizowany zewnętrznie.

To pośrednio oznacza, że ​​metoda tworzy nowe wystąpienie przy każdym wywołaniu. Ponieważ, ponieważ NumberFormat nie jest bezpieczny dla wątków, byłoby inaczej bezużyteczne.

2

Naming Wolę

  • newXxxx lub createXxxx utworzyć nową instancję za każdym razem.
  • getXxxx daje instancję, jeśli już istnieje, ale jej nie stworzy.
  • acquireXxxx lub valueOf utwórz w razie potrzeby, może ale nie musi być nowy.

W tym przypadku jest to podobne do Calendar.getInstance(), które za każdym razem tworzy nową instancję.

0

Przykład: -

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

normalnego użytkowania numberFormat:

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



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

Zgaduję, że jest to cytat z pewnej dokumentacji i odpowiednio sformatowany.Jeśli się mylę, blokowanie powinno zostać usunięte. –

Powiązane problemy