2012-08-10 10 views
9

Considere el siguiente código:¿Se garantiza NumberFormat.getInstance para crear una nueva instancia?

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

¿Es "seguro"? ¿Está garantizado que NumberFormat.getInstance() devuelva un nuevo objeto NumberFormat cada vez?

¿O existe la posibilidad de que getInstance() devuelva la misma instancia? (En cuyo caso el código afectaría a todo el resto del JVM que pasa a utilizar getInstance ...)

Mirando el código fuente que parece como que devuelve una nueva instancia cada vez. El JavaDoc es frustrantemente vago al respecto.

Si el código anterior es realmente "seguro", entonces me parece que getInstance() es un nombre deficiente para este método, que debería llamarse createInstance().

¿Está NumberFormat.getInstance() garantizado para devolver siempre una nueva instancia?

+0

Si es vaga entonces yo no confiar en ella en absoluto –

+0

Sí podría decirse que lo más robusto para hacer es crear un nuevo DecimalFormat. Realmente no quiero que la "configuración regional" actual afecte el comportamiento en ningún caso ... –

Respuesta

8

Sí, es seguro. El código obtiene una instancia de NumberFormatProvider (que debe, según la documentación, devolver una nueva instancia), o crea una nueva instancia de DecimalFormat.

Lógicamente, dado que NumberFormat es mutable, devolver la misma instancia o instancias en caché haría que el método fuera completamente inutilizable.

+0

¿Cómo se obtiene un NumberFormatProvider? – Edmondo1984

+0

@ Edmondo1984 Tú no. Pero NumberFormat.getInstance lo hace, internamente. –

+0

la instancia que obtiene no es segura con respecto al análisis – Edmondo1984

2

Desde la sincronización NumberFormat page

Formatos de número por lo general no están sincronizados. Se recomienda crear instancias de formato separadas para cada hilo. Si múltiples hilos acceden a un formato al mismo tiempo, se debe sincronizar externamente.

Esto indica indirectamente que el método crea una nueva instancia con cada llamada. Porque, dado que NumberFormat no es seguro para subprocesos, de lo contrario sería inutilizable.

2

Naming prefiero

  • newXxxx o createXxxx crear una nueva instancia cada vez.
  • getXxxx le da una instancia si ya existe pero no la creará.
  • acquireXxxx o valueOf crear uno según sea necesario, puede o no ser nuevo.

En este caso, es como Calendar.getInstance() que crea una nueva instancia cada vez.

0

Ejemplo: -

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

uso normal de NumberFormat:

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



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

Supongo que esta es una cita de alguna documentación y he formateado apropiadamente. Si estoy equivocado, debería eliminarse la blockquote. –

Cuestiones relacionadas