请考虑以下代码:
NumberFormat format = NumberFormat.getInstance();
format.setMinimumFractionDigits(spotDecimalPlaces);
format.setMaximumFractionDigits(spotDecimalPlaces);
它是否安全"? NumberFormat.getInstance()
每次都保证返回一个新的NumberFormat
对象吗?
或者getInstance()
是否有可能返回同一个实例? (在这种情况下,此代码会影响JVM中恰好使用getInstance
...)
查看源代码似乎就像每次都返回一个新实例一样。 JavaDoc对此事感到沮丧。
如果上面的代码确实是"安全",那么在我看来,getInstance()
这个方法的名称很差 - 它应该被称为createInstance()
。
NumberFormat.getInstance()
是否保证始终返回新实例?
答案 0 :(得分:10)
是的,这很安全。代码要么从NumberFormatProvider
获取实例(必须根据文档返回新实例),要么创建DecimalFormat
的新实例。
逻辑上,由于NumberFormat
是可变的,因此返回相同的实例或缓存的实例会使该方法完全无法使用。
答案 1 :(得分:3)
<强>同步强>
数字格式通常不同步。建议 为每个线程创建单独的格式实例。如果有多个线程 同时访问格式,必须在外部同步。
这间接表明该方法在每次调用时都会创建一个新实例。因为,由于NumberFormat不是线程安全的,否则它将无法使用。
答案 2 :(得分:2)
我更喜欢命名
newXxxx
或createXxxx
每次都会创建一个新实例。getXxxx
会为您提供一个实例,如果它已经存在但不会创建实例。acquireXxxx
或valueOf
根据需要创建一个,可能是也可能不是新的。在这种情况下,它就像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);