2010-07-30 99 views
5

有很多人反對使用「public/private」靜態方法。我有四處搜尋,沒有運氣,並試圖找到任何提倡善用靜態方法的人。什麼時候應該使用公共靜態方法

假設方法將永遠是Cohesive哪裏可以使用公共靜態方法的可接受區域?這些方法在Java和.NET之間有所不同嗎(又是另一種可以接受)?

這最近SO後刺激了我對這個話題的憤怒/興趣。

+0

當您發佈此問題時,您尋找的答案是什麼? – Fenton 2010-08-04 08:00:02

+0

就像Michael Borgwardt的回答,我只是在等待看看有沒有人對Java和.NET有什麼不同。 – Nix 2010-08-04 12:29:20

回答

4

靜態方法通常不應

  • 訪問其參數之外的任何狀態(因爲其導致難以改變耦合)
  • 修改其參數(因爲如果這樣做,爲什麼它不是該參數的實例方法?)

相反,純函數(即沒有副作用)使良好的靜態方法。

當然,這不應該被視爲絕對的教條。

+0

Singleton GetInstance是修改靜態狀態的靜態方法的最佳示例(可以啓動單例對象) – Nix 2010-07-30 14:56:07

+0

@Nix:單例通常被認爲不是一件好事。並且在訪問器中初始化它們主要用於產生關於雙重檢查鎖定的無窮無盡的討論。 – 2010-07-30 15:47:29

5

如果該方法可以被視爲一個單元,並且可以自行進行有效測試,則使用公共靜態方法。在使用靜態方法的類型上實現依賴注入或模仿很簡單。

我使用的靜態方法的效用方法很少/沒有依賴關係,並定義良好的輸入/輸出。

+1

爲什麼在使用靜態方法的類型上使用DI很困難?同意,如果你正在談論嘲笑有靜態方法的類... – Nix 2010-07-30 13:40:45

+0

@Nix:原諒我離開一點語言不可知論。在.NET中,靜態方法不能是接口的成員。這減少了模擬對象時可用的選項,因爲.NET僅支持類的單一繼承,並且接口不描述整個類合同。請注意,在靜態方法中使用DI *仍然是一回事,使用DI *和*靜態方法很難。 – kbrimington 2010-07-30 13:52:14

2

我會說在簡單工廠中使用它們是公平的,就像返回包含靜態方法的類型的場景一樣。這是不是一個巨大的飛躍,說如果:

string.Empty; 

是一個合法的靜態財產則:

string.GenerateRandomString(); 

是一個合法的靜態方法。但即使如此,我仍然可以看到純粹的OO程序員可能更喜歡StringFactory或RandomStringGenerator類,但我想這一切都取決於您繪製線的位置。

+0

我把問題放在設計上,我的恐懼很明顯的說不要使用靜態方法!將不必要地增加代碼複雜性。 在我們的領域裏,它的全部關於理解何時需要「StringFactory」或「RandomStringGenerator」。 – Nix 2010-07-30 13:35:47

+0

@Nix:我同意。靜態方法有它們的位置。在我的應用程序中,它們傾向於用於實用程序類。 – kbrimington 2010-07-30 13:55:31

0

將方法標記爲靜態會告訴消費者,您不會更改傳入該方法的任何對象的狀態。靜態方法應該對其傳遞的參數執行操作,不應該依賴任何內部字段。

我相信在你引用的文章中給出的具體建議是關於靜態方法的位置 - 而不是使用靜態方法的建議。

+0

在我看來,這篇文章指的是不使用靜態方法......因爲靜態方法缺乏內聚力,所以他們的方法。一個靜態類只能*依賴內部靜態字段*並且修改它們沒有錯誤...?爲什麼靜態方法不能改變傳遞給它們的對象? (假設其有目的) – Nix 2010-07-30 13:44:32

0

一個典型的用途是實現單例模式。

+0

沒錯,但我們中有些人認爲辛格爾頓很少適合。請參見http://www.c2.com/cgi/wiki?SingletonsAreEvil – TrueWill 2010-07-30 14:41:07

+0

與其他工具一樣,正確使用時,Singleton很好。這是導致問題的'正確使用'部分,人們很少正確使用它。 – 2010-07-30 14:47:32

0

我使用靜態/共享的方法不是類的實例的一部分,或者如果我更新「共享」變量(記得使他們線程安全)。

通常,這意味着我最終將這些方法放在包含它們的不同「Manager」類中,我將構造函數標記爲private,以確保它們不能實現。

附註:靜態/共享方法是slightly faster,我記得在CLR中它們的實現與非OOP相關,並且不允許出現在與OOP語言中的設計缺陷有關的接口中。至少)Java固有的 - Discussed Here

0

靜態方法與全局對象實例上的實例方法具有相同的語義。除非你對全局對象實例感興趣,否則你不應該使用靜態方法。這就是說,這取決於情況。有時候,討厭的黑客是正確的做法。

相關問題