我有一个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中使用这种方式会遇到什么问题?
如果我将其用作实例变量,我最终会在多个类中声明它吗?
答案 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");
}