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

はい、安全です。コードは、からインスタンスを取得するかNumberFormatProvider(ドキュメントによると、新しいインスタンスを返す必要があります)、またはの新しいインスタンスを作成しますDecimalFormat

論理的には、NumberFormatは可変であるため、同じインスタンスまたはキャッシュされたインスタンスを返すと、メソッドが完全に使用できなくなります。

于 2012-08-10T11:01:12.597 に答える
3

ページからNumberFormat

同期

通常、数値形式は同期されません。スレッドごとに個別のフォーマットインスタンスを作成することをお勧めします。複数のスレッドが同時にフォーマットにアクセスする場合は、外部で同期する必要があります。

これは、メソッドが呼び出しごとに新しいインスタンスを作成することを間接的に示しています。NumberFormatはスレッドセーフではないため、それ以外の場合は使用できません。

于 2012-08-10T10:58:49.763 に答える
2

私が好むネーミング

  • newXxxxまたはcreateXxxx、毎回新しいインスタンスを作成します。
  • getXxxxインスタンスがすでに存在するが作成されない場合は、インスタンスを提供します。
  • acquireXxxxまたはvalueOf、必要に応じて作成します。新しい場合とそうでない場合があります。

この場合、それは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 に答える