Сонар - сделать DATE_FORMAT переменной экземпляра - PullRequest
0 голосов
/ 04 марта 2019

У меня есть веб-сервис для отдыха, и ниже показано, как я объявил DateFormat, так как это формат даты, который я собираюсь использовать для всего приложения.

Когда я выполнял анализ кода с помощью плагина SonarLint Eclipse, я получил серьезное предупреждение, говоря: «Сделать DATE_FORMAT в качестве переменной экземпляра».

public class Constants {

    private Constants() {

    }

    public static final DateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSS");

}

Может кто-нибудь сказать мнес какой проблемой я мог бы столкнуться, если бы использовал это таким образом в своем API отдыха?
Если я использую его как переменную экземпляра, я в конечном итоге объявлю его в нескольких классах?

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Используйте joda-time или просто замените переменную методом:

public static final DateFormat getDateTimeFormat() {
    return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSS");
}
0 голосов
/ 04 марта 2019

Сработало правило S2885:

Необезопасные поля не должны быть статическими кальмар: S2885Не все классы в стандартной библиотеке Java были написаны, чтобы быть потокобезопасными.Использование их многопоточным способом с большой вероятностью может вызвать проблемы с данными или исключения во время выполнения.Это правило вызывает проблему, когда экземпляр Calendar, DateFormat, javax.xml.xpath.XPath или javax.xml.validation.SchemaFactory помечен как статический.

Поскольку SimpleDateFormat не является потокобезопасным, он не очень хорошо работает с другими потоками.Вы могли бы в конечном итоге неправильно форматировать даты.

Если вы используете Java 8 или выше, вы должны использовать DateTimeFormatter, как в этот ответ .В противном случае использование Joda Time имеет смысл, согласно этому ответу .


В качестве примечания, наличие класса с именем Constants end позволяет ему содержать все виды статических конечных переменныхредко имеет смысл.Как правило, вы должны поместить каждую константу туда, где она принадлежит.

0 голосов
/ 04 марта 2019

Статические переменные в основном используются для констант.
Здесь вы объявили static и присвоили ему экземпляр SimpleDateFormat.
Либо сделайте DATE_TIME_FORMAT нестатичным, либо назначьте константу этой переменной.

Лучше поменяйте его на переменную экземпляра и используйте Sting для этого.
Например, public final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss:SSS";

...