亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么靜態變量被認為是邪惡的?

為什么靜態變量被認為是邪惡的?

為什么靜態變量被認為是邪惡的?我是一個Java程序員誰是新的企業世界。最近,我開發了一個應用程序Groovy還有爪哇。在我編寫的代碼中,使用了相當多的靜力學。高級技術部要求我減少使用靜力學的數量。我在谷歌上搜索過類似的內容,我發現很多程序員都相當反對使用靜態變量。我發現靜態變量更便于使用。而且我認為它們也是有效的(如果我錯了,請糾正我),因為如果我必須在類中調用10,000個函數,我很樂意將方法靜態化,并使用簡單明了的方法。Class.methodCall()而不是用類的10,000個實例凌亂內存,對嗎?此外,靜力學減少了對代碼其他部分的相互依賴。他們可以充當完美的州持有者。此外,我發現靜力學在一些語言中得到了廣泛的實現,例如小談話和斯卡拉。那么,為什么這種對靜力學的壓迫在程序員中很普遍(尤其是在Java世界中)?PS:如果我對靜力學的假設是錯誤的,請糾正我。
查看完整描述

3 回答

?
UYOU

TA貢獻1878條經驗 獲得超4個贊

靜態變量表示全局狀態。這很難推理,也很難測試:如果我創建一個對象的新實例,我可以在測試中推理它的新狀態。如果我使用靜態變量的代碼,它可能處于任何狀態,而且任何東西都可以修改它。

我可以繼續講很長一段時間,但更大的概念是,事物的范圍越窄,推理就越容易。我們善于思考小事情,但如果沒有模塊化,就很難對一百萬行系統的狀態進行推理。順便說一句,這適用于各種事物-不僅僅是靜態變量。


查看完整回答
反對 回復 2019-05-30
?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

它不太面向對象:有些人認為靜力學是“邪惡”的原因之一是它們與面向對象范式。特別是,它違反了數據封裝在對象(可以擴展、信息隱藏等)中的原則。靜力學,以你描述的方式使用它們,本質上是將它們作為一個全局變量來使用,以避免處理像范圍這樣的問題。然而,全局變量是過程或命令式編程范式的定義特征之一,而不是面向對象代碼的“好”特性。這并不是說過程范式是糟糕的,但我得到的印象是,您的主管希望您編寫“良好的面向對象的代碼”,并且您確實希望編寫“良好的過程代碼”。

當您開始使用靜力學時,Java中有許多問題并不總是顯而易見的。例如,如果程序的兩個副本運行在同一個VM中,那么它們會不會SHRE靜態變量的值和彼此狀態的混亂?或者當您擴展類時,可以覆蓋靜態成員嗎?您的VM是否因為有大量的靜力學而耗盡內存,并且無法為其他所需的實例對象回收內存?

對象生命周期:此外,靜力學的生命周期與程序的整個運行時相匹配。這意味著,即使使用完類,也不能垃圾收集所有這些靜態變量的內存。例如,如果您將變量設置為非靜態變量,并且在main()函數中創建了類的單個實例,然后要求類執行特定函數10,000次,一旦完成這10,000次調用,并且刪除對單個實例的引用,則可以垃圾收集和重用所有靜態變量。

防止某些重復使用:此外,靜態方法不能用于實現接口,因此靜態方法可以阻止某些面向對象的特性可用。

其他備選方案:如果效率是您最關心的問題,那么可能還有其他更好的方法來解決速度問題,而不是僅僅考慮調用通常比創建更快的優點??紤]是否在任何地方都需要瞬態或易失性修飾符。為了保持內聯的能力,方法可以標記為Final而不是靜態的。方法參數和其他變量可以標記為Final,以允許基于可以更改這些變量的假設進行某些編譯器優化??梢远啻沃赜脤嵗龑ο?,而不是每次創建新實例。可能會有復雜優化開關,應該打開的應用程序在一般情況下。也許,設計應該設置,這樣就可以運行10,000次多線程,并利用多處理器內核。如果可移植性不是一個問題,也許一個本地的方法會讓你比你的靜力學更快。

如果由于某種原因不希望一個對象的多個副本,則單例設計模式,與靜態對象相比具有優勢,例如線程安全(假定您的單例代碼編寫得很好)、允許延遲初始化、確保對象在使用時被正確初始化、子類化、測試和重構代碼方面的優勢,更不用說,如果您在某一時刻改變了只想要一個對象實例的想法,那么刪除代碼以防止重復實例要比重構所有靜態變量代碼以使用實例變量容易得多。我以前不得不這樣做,這并不有趣,最后你不得不編輯更多的類,這就增加了引入新bug的風險…所以最好在第一次設置“正確”的東西,即使它似乎有它的缺點。對我來說,如果你決定在路上需要多個副本的話,你所需要的返工可能是盡可能不經常使用靜力學的最有說服力的原因之一。因此,我也不同意你所說的靜力學減少相互依賴的說法,我認為,如果你有很多可以直接訪問的靜力學,而不是一個“知道如何在自己身上做某事”的對象,你最終會得到更多耦合的代碼。


查看完整回答
反對 回復 2019-05-30
?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

邪惡是一個主觀的術語。

你不能在創造和毀滅方面控制靜力學。他們是按程序裝卸的要求生活的。

由于靜力學存在于一個空間中,所有希望使用它們的線程都必須通過您必須管理的訪問控制。這意味著程序更加耦合,這一變化更難以設想和管理(如J·斯基特所說)。這會導致隔離更改影響的問題,從而影響測試的管理方式。

這是我對它們的兩個主要問題。


查看完整回答
反對 回復 2019-05-30
  • 3 回答
  • 0 關注
  • 726 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號