4

MessageFormat、DateFormat、DecimalFormat などを使用して、webapp で書式設定を行いたいです。

これらはスレッドセーフではないため、使用ごとに 1 つの静的インスタンスは機能しませんが、必要になるたびに新しい XXXXFormat オブジェクトを作成するのは無駄に思えます。ThreadLocal でそれらをキャッシュして再利用することは、明らかな最適化のようです。

これは非常に一般的なパターンのように思えるので、適切なライブラリがあるかどうか疑問に思っています。

呼び出す代わりに:

    DecimalFormat formatter = new DecimalFormat("###,##0.00");

    String formatted = formatter.format(value);             

何かをフォーマットする必要があるたびに、なぜですか:

    String formatted = FormatCache.formatDecimal("###,##0.00",numberValue);

FormatCache は、フォーマット パターンをキーにした HashMap を使用して ThreadLocal キャッシュを実行しますか?

おそらく、次のような他の方法があるでしょう:

    String FormatCache.formatDecimal(String, Number);
    String FormatCache.formatDate(String, Date);
    String FormatCache.formatMessage(String, Object...);
4

3 に答える 3

5

Apache Commons Langには がFastDateFormatあり、(私の意見では) 問題を正しい方法で解決します。最初からスレッドセーフであることだけです。

FastDateFormat は、SimpleDateFormat の高速でスレッドセーフなバージョンです。

このクラスは、ほとんどの書式設定状況で SimpleDateFormat の直接の代替として使用できます。このクラスは、マルチスレッド サーバー環境で特に役立ちます。SimpleDateFormat はどの JDK バージョンでもスレッドセーフではありません。また、Sun がバグ/RFE をクローズしたため、そうなる予定もありません。

于 2012-08-03T19:46:49.573 に答える
2

みたいなことには本当に気をつけたほうがいいです。標準 (単純) フォーマッターはスレッドセーフではありません。いくつかの共有/キャッシュフォーマターでマルチスレッド関連の問題に遭遇しましたが、それは数年前のことです (Java 1.4)。JavaDocs ( SimpleDateFormat ) を確認すると、次のことがわかります。

同期

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

于 2012-08-03T22:12:59.330 に答える