声纳-将DATE_FORMAT设置为实例变量

时间:2019-03-04 07:36:45

标签: java sonarqube sonarlint

我有一个REST Web服务,以下是我如何声明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 :(得分:2)

静态变量主要用于常量。
在这里,您声明了static并为其分配了SimpleDateFormat的实例。
DATE_TIME_FORMAT设为非静态,或为此变量分配一个常量。

最好将其更改为实例变量,然后使用Sting进行操作。
例如 public final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss:SSS";

答案 1 :(得分:1)

触发的规则是S2885:

  

非线程安全字段不应为静态

  鱿鱼:S2885

  并非标准Java库中的所有类都被编写为线程安全的。以多线程方式使用它们很可能在运行时导致数据问题或异常。   当Calendar,DateFormat,javax.xml.xpath.XPath或javax.xml.validation.SchemaFactory的实例标记为静态时,此规则会引起问题。

由于SimpleDateFormat不是线程安全的,因此无法在线程之间共享时很好地工作。您可能会以错误的日期格式结尾。

如果您使用的是Java 8或更高版本,则应使用DateTimeFormatter,就像this answer一样。否则,根据this answer,使用Joda Time表示意义。


作为旁注,让名为Constants的类结尾时,它包含各种静态最终变量的情况很少出现。通常,您应该将每个常数放在其所属位置。

答案 2 :(得分:0)

使用joda-time或简单地将变量替换为方法:

public static final DateFormat getDateTimeFormat() {
    return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSS");
}