2012-11-19 131 views
1

可能重複:
Why are static variables considered evil?靜態方法和靜態變量,糟糕的設計實踐?

已經在大學學習面向對象編程和設計在幾年前,我記得講師使用靜態變量或靜態方法在人們越來越漂亮生氣,因爲他們將靜態描述爲非常糟糕的設計。

我的理解是這樣的 靜態類型的東西是獲得全局「視覺」的東西,即它可以被任何東西訪問。

我的理解是否正確?有沒有關於使用靜態的信息,使它不好用?有沒有辦法避免在代碼中使用靜態變量或方法?

順便說一句,我知道主要方法的靜態是應用程序成功操作的先決條件。

+4

可能的重複[爲什麼靜態變量被認爲是邪惡?](http://stackoverflow.com/questions/7026507/why-are-static-variables-considered-evil) - 注意:鏈接只能靜態變量。靜態方法沒有錯 - 例如:http://stackoverflow.com/questions/2671496/java-when-to-use-static-methods – assylias

回答

1

靜態主要用於在不創建類實例的情況下訪問類成員。如您所知,爲什麼我們在運行時只寫bkz public static void main() jvm可以在不創建類對象並啓動程序的情況下訪問此方法。

它取決於您的要求,如何使用或說如何使用訪問說明符作爲私有,公共,默認和聲明的類的成員,並保護訪問級別,而靜態是爲了使其與訪問級別一樣是靜態的。

如果不是靜態的,您必須將您的成員聲明爲公共的,或者如果您繼承了您的類,那麼也會將其設爲受保護的。就像在同一個包中一樣,你定義了這個類,然後靜態地繼承這個類。而對於使用沒有inhert類,你需要創建一個類的對象,那麼你就可以訪問有成員(請注意,根據訪問符)

這裏是以下更多詳細的聯繫

http://xahlee.info/java-a-day/access_specifiers.html

http://www.javabeginner.com/learn-java/introduction-to-java-access-modifiers

2

靜態變量或方法沒有問題。這只是與OOP你想盡可能多的行爲與對象關聯,這意味着使用實例方法和變量。話雖如此,有些情況下需要靜態成員:構造函數(如您所述)和Singleton模式都是很好的例子。

+0

作爲一個例子,它違反了多態概念 – Blasanka

0

使用靜態變量的主要合法案例是singleton pattern,並且沒有其他方法可以這樣做。

單身人士的訪問器方法,特別是使用lazy initialization的訪問器方法需要靜態方法。

單身人士沒有什麼「壞」。

+0

你能澄清一點嗎? –

1

靜態變量和靜態方法是完全不同的事情。

靜態變量是不好的,除非它們代表某種「單身」,如果他們這樣做,那麼在OOP中最好創建實際的單身類(尤其是如果你可以使用枚舉單例)。除此之外,靜態變量使多線程編程變得困難,甚至在單線程編程中也可以這樣做,在單線程編程中,「意外」需要使用靜態字段的兩個類實例。

另一方面,靜態方法通常都很好,只要它們不訪問任何靜態數據,但只能操作它們的參數。當然,如果你注意到你有static void MyStaticUtils.operateOnFoo(Foo foo),那麼使用非靜態的void Foo.operate()方法要好得多。但是有時你沒有向現有類中添加方法的奢望,並且必須對現有方法返回的實例進行操作,然後靜態實用方法絕對是不錯的選擇。