Не удалось найти подходящее решение в Интернете, поэтому я решил спросить, правильный ли мой способ использования формата java.
1) В документации NumberFormat.java говорится, что
Числовые форматы обычно не синхронизируются. Рекомендуется создавать отдельные экземпляры формата для каждого потока.
Мы использовали объекты форматирования (статически инициализированные) в многопоточной среде без каких-либо проблем. Возможно, это связано с тем, что после определения форматов их состояние не изменяется (т.е. после этого не вызываются сеттеры)
2) Теперь мне нужно определить новый формат, который должен выводить одну или две значащие цифры после запятой, в зависимости от некоторой дополнительной логики. То, как я это сделал, заключалось в том, чтобы определить новую оболочку формата и делегировать два разных DecimalFormat в зависимости от случая в перезаписанном методе #format(double, StringBuffer, FieldPosition). Вот код для этого:
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);
}
}
};
Это лучшая практика? У меня есть опасения по поводу фактического использования класса-оболочки (он служит только для соответствия интерфейсу NumberFormat и делегирует всю работу над внутренними форматами). Я не хочу вызывать DecimalFormat#applyPattern(), поскольку я думаю, что это поставит под угрозу изменчивый параллелизм.
Спасибо