Ich konnte keine passende Lösung im Web finden, daher dachte ich mir zu fragen, ob meine Art der Verwendung eines Java-Formats korrekt ist.Thread-sicheres dynamisches Muster für NumberFormat/DecimalFormat
1) In der NumberFormat.java Dokumentation heißt es, dass
Zahlenformate werden in der Regel nicht synchronisiert. Es wird empfohlen, separate Format-Instanzen für jeden Thread zu erstellen.
Wir haben Formatobjekte (statisch initialisiert) in einer Multithread-Umgebung ohne Probleme verwendet. Ist es vielleicht, weil, sobald die Formate definiert sind, wir ihren Zustand nicht geändert werden (dh, keine Setter werden danach aufgerufen)
2) Ich muss jetzt ein neues Format definieren, das entweder eine oder zwei signifikante Ziffern nach Komma ausgeben sollte , abhängig von einer zusätzlichen Logik. Die Art, wie ich es getan habe, war, einen neuen Format-Wrapper zu definieren und auf zwei unterschiedliche DecimalFormat zu delegieren, abhängig vom Fall in der überschriebenen Methode #format (double, StringBuffer, FieldPosition). Hier ist der Code dafür:
private final NumberFormat FORMAT = new DecimalFormat() {
private final NumberFormat DECIMAL_FORMAT = new DecimalFormat("0.##");
private final NumberFormat DECIMAL_FORMAT_DIGIT = new DecimalFormat(
"0.0#");
public StringBuffer format(double number, StringBuffer result, java.text.FieldPosition fieldPosition) {
if ((number >= 10 && Math.ceil(number) == number)) {
return DECIMAL_FORMAT.format(number, result, fieldPosition);
} else {
return DECIMAL_FORMAT_DIGIT.format(number, result, fieldPosition);
}
}
};
Ist es die beste Praxis? Ich habe Bedenken, die Wrapperklasse nicht zu verwenden (sie dient nur dazu, der NumberFormat-Schnittstelle zu entsprechen und alle Arbeiten an inneren Formaten zu delegieren). Ich möchte DecimalFormat # applyPattern() nicht aufrufen, da dies die flüchtige Nebenläufigkeit kompromittieren würde.
Dank
Es ist nicht empfehlenswert, NumberFormat-Instanzen über mehrere Threads hinweg zu verwenden/zu teilen. Obwohl Sie bis jetzt kein Problem hatten, werden sie auftreten, sobald Ihre Anwendung eine echte gleichzeitige Verarbeitung erreicht hat. Wir hatten einen ähnlichen Anwendungsfall für DateFormat, wo statisch erzeugte Datumsformate verwendet wurden, aber wir skalierten unsere Anwendung für riesige Datenverarbeitung, wo n-gleichzeitige Prozesse die Daten aufwirbeln, fanden wir, dass Format Ihnen sehr seltsame und unerwartete Ergebnisse geben kann. Sie können nicht fehlschlagen, aber erhalten einen unerwarteten Wert –
@SangramJadhav, so dass Sie wahrscheinlich einen wiederverwendbaren Thread-Pool von Formaten behalten, richtig? – d56
Wenn Sie das Format freigeben möchten, müssen Sie eine eigene Synchronisierung bereitstellen. Oder Sie können ThreadLocal verwenden, um eine Formatinstanz zu deklarieren. Auf diese Weise erhält jeder Thread eine eigene Kopie des Formatierungsprogramms und Sie müssen keine Synchronisierung bereitstellen. –