2009-04-08 62 views
20

在Java中,何時應該使用靜態非最終變量?最佳實踐:Java靜態非最終變量

例如

private static int MY_VAR = 0; 

顯然,我們現在談的不是常量在這裏。

public static final int MY_CONSTANT = 1; 

在我的經驗,使用一個單身的時候我經常正當他們,但我最終需要有多個實例,並導致自己十分頭疼的問題,並重新理。

它似乎是罕見的,他們應該在實踐中使用。你怎麼看?

回答

21

統計收集可能使用非最終變量,例如,來計算創建的實例的數量。另一方面,對於這種情況,您可能要使用AtomicLong等,此時它可能是最終的。或者,如果你正在收集多個統計數據,你最終可能會得到一個Statistics類,並最終引用它的一個實例。

擁有(合理的)非最終靜態變量當然是非常罕見的。

+0

+1,但請使用Atomics。考慮到它是「靜態的」,假設有多個線程可以訪問。 – 2009-04-08 18:46:49

6

當用作緩存時,記錄,統計或調試開關顯然是合理的用途。所有私人,當然。

如果您將可變對象分配給最終字段,那在道義上與具有可變字段相同。

某些語言(如Fan)完全禁止可變靜態(或等效)。

+0

http://code.google.com/p/noop/也沒有任何靜態 – Eduardo 2011-03-17 20:58:58

2

在我的經驗中,靜態非最終變量應該只用於單例實例。其他任何東西都可以由單例(比如緩存)更乾淨地包含,或者做成最終的(例如記錄器引用)。不過,我不相信有嚴格的規定,所以我會以一粒鹽來接受我的建議。這就是說,我會建議仔細檢查任何情況下,你考慮聲明一個非最終的靜態變量,除了單例實例,並看看它是否可以重構或實現不同 - 即移動到單身容器或使用最後一個引用mutable目的。

0

我認爲包裝你的靜態和通過單身(或至少通過靜態方法)提供訪問通常是一個好主意,因爲你可以更好地控制訪問並避免一些競爭條件和同步問題。

0

一個靜態變量意味着它可以作爲一個整體來使用,所以這兩個例子都可以作爲一個整體。最後意味着價值不能改變。所以我想問題是,你想要一個值可以被整個類使用,並且在實例化後它不能被改變。我的猜測會是一個常量,可用於該類的所有實例。否則,如果你需要類似人口計數器那麼非最終變量。

1

靜態變量可用於控制應用程序級別的行爲,例如指定全局日誌記錄級別,要連接的服務器。

我在舊應用程序中遇到過這樣的用例,通常來自其他公司。

現在使用靜態變量來實現這樣的目的顯然是不好的做法,但它在1999年並不是那麼明顯。沒有Spring,沒有log4j,沒有來自R.C.Martin的乾淨代碼等。

Java語言現在已經很老了,即使現在一些功能強烈地被阻止,它在開始時經常被使用。而且由於向後兼容,它不太可能改變。

0

個人對於類非最終變量我使用CamelCase符號。從代碼中可以清楚看出它是一個類變量,因爲您必須像這樣引用它:FooBar.bDoNotRunTests

在那個筆記上,我用this加上類實例變量的前綴來區分它們與本地作用域變量。恩。 this.bDoNotRunTests