2017-07-27 42 views
1

SonarQube 5.5(與sonar-java-plugin-3.13.1.jar插件)報告了這個代碼的問題:如何解決「Make field an instance variable」問題?

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; 
    } 
} 

的錯誤消息是Make "DATE_FORMATTER" an instance variable.

我怎樣才能避免這種SonarQube問題?

+1

這篇文章介紹了一個實例變量是什麼:https://stackoverflow.com/questions/ 16686488/java-what-is-an-variable-變量 – ChristofferPass

+0

您使用的SonarQube和SonarJava插件的版本相當陳舊。你應該更新到更新的版本。 –

回答

4

在上面的類中,SonarQube試圖說DATE_FORMATTER如果沒有被任何static方法使用,則不需要是靜態的。

事實上,SimpleDateFormat也不應該是一個實例變量,因爲它不是線程安全的(解釋爲here)。如果多個線程同時訪問​​類的方法,則會導致錯誤的結果。

如果格式是相同的,那麼你可以聲明爲final String,並在本地創建SimpleDateFormat情況下,如:

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 
} 
+0

是的,明白了。感謝您的幫助。 – Feliks

+0

對於日誌,如果你有性能限制,你也可以考慮使用'ThreadLocal'來爲每個線程存儲一個日期格式。 – slartidan