NumberFormat.getInstance是否可以保证创建新实例?

时间:2012-08-10 10:54:36

标签: java

请考虑以下代码:

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

它是否安全"? NumberFormat.getInstance()每次都保证返回一个新的NumberFormat对象吗?

或者getInstance()是否有可能返回同一个实例? (在这种情况下,此代码会影响JVM中恰好使用getInstance ...)

的其他位置

查看源代码似乎就像每次都返回一个新实例一样。 JavaDoc对此事感到沮丧。

如果上面的代码确实是"安全",那么在我看来,getInstance()这个方法的名称很差 - 它应该被称为createInstance()

NumberFormat.getInstance()是否保证始终返回新实例?

4 个答案:

答案 0 :(得分:10)

是的,这很安全。代码要么从NumberFormatProvider获取实例(必须根据文档返回新实例),要么创建DecimalFormat的新实例。

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

答案 1 :(得分:3)

来自NumberFormat page

<强>同步

  

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

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

答案 2 :(得分:2)

我更喜欢命名

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

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

答案 3 :(得分: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);