如何解决"Make field an instance variable"问题?

Fel*_*iks 1 java sonarqube

SonarQube 5.5(带sonar-java-plugin-3.13.1.jar插件)报告此代码的问题:

public class TimeA {
    public static final SimpleDateFormat DATE_FORMATTER;

    static {
        SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        df.setTimeZone(TimeZone.getTimeZone("GMT"));
        DATE_FORMATTER=df;
    }
} 
Run Code Online (Sandbox Code Playgroud)

错误消息是 Make "DATE_FORMATTER" an instance variable.

我怎样才能避免这个SonarQube问题?

Dar*_*hta 5

在上面的类中,SonarQube试图说DATE_FORMATTER如果没有任何static方法使用它就不需要是静态的.

实际上,SimpleDateFormat也不应该是一个实例变量,因为它不是线程安全的(在这里解释).如果多个线程同时访问TimeA类的方法,那么将导致不正确的结果.

如果格式相同,那么您可以将其声明为a final StringSimpleDateFormat在本地创建实例,例如:

public final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";

public void someMethod(){
    SimpleDateFormat df=new SimpleDateFormat(DATE_FORMAT);
    df.setTimeZone(TimeZone.getTimeZone("GMT"));
    //Further processing
}
Run Code Online (Sandbox Code Playgroud)