簡體   English   中英

最佳實踐:Java靜態非最終變量

[英]Best Practice: Java static non final variables

在Java中,什么時候應該使用靜態非最終變量?

例如

private static int MY_VAR = 0;

顯然我們不是在談論常數。

public static final int MY_CONSTANT = 1;

根據我的經驗,我經常在使用單身時證明他們是合理的,但后來我最終需要有一個以上的實例並導致自己非常頭疼並重新考慮因素。

它們似乎很少應該在實踐中使用。 你怎么看?

統計信息收集可能使用非最終變量,例如計算創建的實例數。 另一方面,對於那種情況,你可能想要使用AtomicLong等,這時它可以是最終的。 或者,如果您收集多個統計信息,則最終可能會使用Statistics類以及對其實例的最終引用。

擁有(合理地)非最終靜態變量肯定是非常罕見的。

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

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

有些語言,如Fan,完全不允許使用可變靜態(或等效的)。

根據我的經驗,靜態非final變量只應用於單例實例。 其他所有東西都可以由單例(例如緩存)更清晰地包含,或者最終(例如記錄器引用)。 但是我不相信嚴格的規則,所以我會毫不猶豫地接受我的建議。 這就是說我會建議仔細檢查你認為除了單例實例之外聲明一個非最終靜態變量的任何情況,看看它是否可以被重構或以不同的方式實現 - 即移入單例容器或使用對mutable的最終引用賓語。

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

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

現在使用靜態變量顯然是不好的做法 ,但是在1999年它並不那么明顯。沒有Spring,沒有log4j,沒有來自RCMartin的清潔代碼等。

Java語言現在已經很老了,即使現在強烈建議不要使用某些功能,它也經常在開頭使用。 而且由於向后兼容性,它不太可能改變。

對於類非final變量,我個人使用CamelCase表示法。 從代碼中可以清楚地看出它是一個類變量,因為你必須這樣引用它: FooBar.bDoNotRunTests

在這方面,我使用this作為實例變量的前綴,以區別於局部范圍變量。 恩。 this.bDoNotRunTests

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

靜態變量意味着它可以作為一個整體用於類,因此這兩個示例都可以作為整體使用。 最終意味着該值無法更改。 所以我想問題是你希望什么時候一個值可供整個類使用,並且在實例化之后它不能被更改。 我的猜測將是該類的所有實例化的常量。 否則,如果您需要像人口計數器這樣的東西,那么非最終變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM