10

考虑以下代码:

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

它“安全”吗?NumberFormat.getInstance()保证退换新NumberFormat每次都

还是有可能getInstance()返回相同的实例?(在这种情况下,这段代码会影响 JVM 中碰巧使用的其他任何地方getInstance......)

查看源代码似乎每次都返回一个新实例。JavaDoc 在这件事上含糊不清,令人沮丧。

如果上面的代码真的是“安全的”,那么在我看来,getInstance()这个方法的名字很糟糕——它应该被调用createInstance()

NumberFormat.getInstance()保证总是返回一个新实例吗?

4

4 回答 4

11

是的,它是安全的。代码要么从 a 获取一个实例NumberFormatProvider(根据文档,它必须返回一个新实例),或者它创建一个DecimalFormat.

从逻辑上讲,由于NumberFormat是可变的,因此返回相同的实例或缓存的实例会使该方法完全不可用。

于 2012-08-10T11:01:12.597 回答
3

NumberFormat页面

同步

数字格式通常不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一个格式,它必须在外部同步。

这间接表明该方法在每次调用时都会创建一个新实例。因为,由于 NumberFormat 不是线程安全的,否则它将无法使用。

于 2012-08-10T10:58:49.763 回答
2

命名我更喜欢

  • newXxxxcreateXxxx每次都创建一个新实例。
  • getXxxx如果它已经存在但不会创建一个实例,它会给你一个实例。
  • acquireXxxxvalueOf根据需要创建一个,可能是也可能不是新的。

在这种情况下,就像Calendar.getInstance()每次创建一个新实例一样。

于 2012-08-10T10:58:57.140 回答
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);
于 2013-05-14T10:33:27.620 回答