2012-11-14 41 views
8

我有一個Java類是這樣的:寫入靜態字段 - FindBugs在這種情況下是錯誤的嗎?

public class Foo { 

    public static int counter = 0; 

    public void bar(int counter) { 
     Foo.counter = counter; 
    } 
} 

FindBugs的警告我,通過實例方法bar寫靜態字段counter。但是,如果我將代碼更改爲:

public class Foo { 

    public static int counter = 0; 

    public static void setCounter(int counter) { 
     Foo.counter = counter; 
    } 

    public void bar(int counter) { 
     setCounter(counter); 
    } 
} 

然後FindBugs不會抱怨。這不是錯的嗎?我仍然從一個實例方法寫靜態字段,只是通過靜態方法,我不是嗎?

+3

這個決定背後的理由讓我知道什麼時候自動工具成爲能夠檢測各種編程錯誤的,這樣我就可以開始尋找新的職業生涯。 – NullUserException

+0

但在這種情況下它只是一種。 :P我對這個工具很陌生,並且還不知道它的結果有多可靠。 :) – htorque

+1

如果FindBugs發出警告,最好看看問題。但是,這並不意味着如果FindBugs不會發出任何警告,那麼您的代碼是完美無缺的。 –

回答

13

假設在將來的某個時間點,您決定這個setter方法需要線程安全,並且您想使其成爲​​。

此代碼將正常工作:

public synchronized static void setCounter(int counter) { 
    Foo.counter = counter; 
} 

public void bar(int counter) { 
    setCounter(counter); 
} 

這段代碼是錯誤的,將有不正確的行爲:

public synchronized void bar(int counter) { 
    Foo.counter = counter; 
} 

這似乎是在這個人爲的例子一個顯著差異可能不會,特別是因爲counter通常可以標記爲volatile。然而,在一個現實世界的例子中,setter方法具有更復雜的邏輯並且從許多不同的地方被調用(不僅僅來自一個實例方法),後一個模式將更容易重構。

順便說一下,在我看來,Google's CodePro Analytix插件是一個比FindBugs更快更全面的工具。

相關:

+0

CodePro AnalytiX是否在4.2(Juno)下運行? – erickson

+0

@erickson不確定...我的公司使用定製的Eclipse內部版本,所以我不必在一段時間內使用vanilla Eclipse。 – dbyrne

4

bug descriptions的FindBugs的列表:

ST:從實例方法 (ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD)寫入靜態字段

此實例方法寫入靜態字段。如果在操作多個實例時得到 是很正確的,並且通常不好的 練習。

通過從實例方法調用的靜態方法訪問靜態字段沒有類似的錯誤描述。

您可能要討論的FindBugs的mailing list