Affects PMD Version: 6.22
Rule: UnsynchronizedStaticFormatter
Description: False Positive when using the format in a static initializer
Code Sample demonstrating the issue:
import java.text.NumberFormat;
class WithFormatter {
private static final NumberFormat formatter;
static {
formatter = NumberFormat.getInstance();
formatter.setMaximumFractionDigits(2); // FALSE POSITIVE
}
// …
}
This is a false positive because it is impossible for this static initializer to be executed in parallel by multiple threads on the same class instance.
Running PMD through: Gradle
Workaround 1: Factory Method
Instead of a static initializer, use a static method, like this:
import java.text.NumberFormat;
class WithFormatter {
private static final NumberFormat formatter = createFormatter();
private static NumberFormat createFormatter() {
final NumberFormat formatter = NumberFormat.getInstance();
formatter.setMaximumFractionDigits(2);
return formatter;
}
}
Workaround 2: Local variable in static initializer
import java.text.NumberFormat;
class WithFormatter {
private static final NumberFormat formatter;
static {
final NumberFormat f = NumberFormat.getInstance();
f.setMaximumFractionDigits(2);
formatter = f;
}
}
Workaround 3: Lambda Call
import java.text.NumberFormat;
class WithFormatter {
private static final NumberFormat formatter = ((Supplier<NumberFormat>) () -> {
final NumberFormat formatter = NumberFormat.getInstance();
formatter.setMaximumFractionDigits(2);
return formatter;
}).get();
}
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4