DateFormats не являются потокобезопасными, то есть они поддерживают внутреннее представление состояния. Использование их в статическом контексте может привести к довольно странным ошибкам, если несколько потоков обращаются к одному экземпляру одновременно.
Мое предложение состояло бы в том, чтобы сделать ваши переменные локальными там, где вы их используете, вместо того, чтобы делать их статическими свойствами класса. Похоже, что вы можете делать это при инициализации класса, поэтому вы можете сделать это в конструкторе:
public class MyClass {
private String fileName;
public MyClass() {
final Date today = Calendar.getInstance().getTime();
final DateFormat yymmdd = new SimpleDateFormat("yyMMdd");
this.fileName = "file_" + yymmdd.format(TODAY);
}
...
}
И если вам нужно использовать форматтер в нескольких местах, вы можете просто сделать шаблон static final
и создать новый локальный DateFormat
, когда это необходимо:
public class MyClass {
private static final String FILENAME_DATE_PATTERN = "yyMMdd";
public void myMethod() {
final DateFormat format = new SimpleDateFormat(FILENAME_DATE_PATTERN);
// do some formatting
}
}
Документация FindBugs для этой проблемы гласит:
Как утверждает JavaDoc, DateFormats
небезопасно для многопоточных
использовать. Детектор обнаружил звонок
экземпляр DateFormat, который имеет
были получены через статическое поле. это
выглядит подозрительно.
Для получения дополнительной информации см. Sun
Ошибка # 6231579 и ошибка солнца # 6178997.
И Javadoc для DateFormat предлагает:
Форматы даты не синхронизированы. Это
рекомендуется создать отдельный
форматировать экземпляры для каждого потока. Если
несколько потоков обращаются к формату
одновременно он должен быть синхронизирован
внешне.
Ответ Джека Лиу также имеет хорошее замечание о семантике вашего статического использования "СЕГОДНЯ".
Кроме того, я действительно видел, как это происходит в производственной среде с большим трафиком, и отладка вначале очень запутанная вещь; поэтому, по моему опыту, предупреждение FindBugs на самом деле является полезным предложением (в отличие от некоторых других правил статического анализа, которые иногда кажутся придирчивыми).