2009-11-20 29 views
2

如果一個類實現了單例模式,那麼所有的變量是否應該聲明爲靜態的?java單例模式,所有變量都應該是類變量嗎?

是否有任何理由不應聲明爲靜態?這有什麼不同嗎?

+1

首先,你有沒有考慮過不使用Singleton模式?它在面向對象編程中被稱爲反模式。 – nandokakimoto 2009-11-20 00:44:11

+4

我從來沒有同意過單身模式是不好的。將它用作'神'對象並不是一個好主意,但它有它的位置。 – paxdiablo 2009-11-20 00:45:53

+0

單身人士很有意義的地方很少 - 字符串外部化是我看到的唯一規律性的地方,即使如此,當今大多數流行的平臺都提供了更好地封裝該用例的庫或語言功能。 – 2009-11-20 00:51:38

回答

12

不是。單例模式意味着一個實例是唯一的實例 - 它並不意味着「使所有的東西都是靜態可訪問的」。

單例模式爲您提供「單一實例」的所有好處,而不會犧牲測試和重構代碼的能力。

編輯:

我想指出的一點是,有之間的功能應該如何消費的差異(取決於上下文),和功能應該如何初始化。

在大多數情況下,您的對象只會有一個實例(例如,在您的最終生產系統中),這可能是適當的。但是也有其他的背景(比如測試),如果你強迫它成爲唯一的選擇,那將會變得更加困難。

此外,使靜態的東西不僅僅是「我的課程只有一個實例可以訪問」 - 這通常是我們的目的。另外,在我工作過的軟件中,對象的初始化和生命週期通常由其他人控制(我在這裏談論的是DI) - 並且使靜態的東西在這裏沒有任何幫助。

+1

嚴格來說,單例模式允許您限制實例的數量,使其可能爲零或更多(如果它是惰性初始化,則爲零)。這是常見的。如果你想讓它變爲2或更多,那麼靜態會讓它變得更難。 – TofuBeer 2009-11-20 03:14:58

+0

@TofuBeer,如果你被允許的話,它肯定不會是一個單身人士。這不是一個雙子? :-) – paxdiablo 2009-11-20 13:28:59

4

在一個常見的單例模式中,你使用靜態方法而不是。你編寫類來使用普通字段,在構造函數中進行初始化,然後安排執行一次,將結果存儲在某個靜態位置。

1

可以這樣做(不一定應該)。但是,即使是單身,我傾向於讓所有的變量對象級而不是階級層次的原因是:

  • 我可能會在某個時候決定一個單是這個類和有類級別的一個壞主意變量會使重構變得更加困難。
  • 使用對象級變量時,它們只在實例化單例時纔會存在。在課堂上,他們總是在那裏。

底線:我從來沒有想過把它們作爲對象級別的缺點,所以我就是這麼做的。以上兩個級別的缺點可能是微不足道的,但他們在那裏。它最終可能歸結爲個人偏好。

+0

+1。技術上靜態字段不是「永遠存在」 - 當類加載時它們「存在」。 – ChssPly76 2009-11-20 00:44:17

3

不,通常是靜態的唯一的東西是對單例本身的引用(還有其他方法來存儲該引用,例如JNDI或依賴注入容器)。

沒有將字段聲明爲靜態(即使在單例模式中只需要其中一個實例)的原因是,這使您可以靈活地創建另一個通常爲單例類的另一個稍微不同的實例。您可能希望在特殊情況下執行此操作,例如進行測試。

即使你不(認爲你)需要這種靈活性,也沒有理由放棄它。將字段聲明爲靜態不會帶來任何好處,您將會失去。

+0

+1在適當的情況下提供單一實例訪問權限,而不會放棄「多個實例」的好處,這是將所有內容都設爲靜態時會發生的情況。 – 2009-11-20 00:47:14

0

您可以在如何(一種可能的方式)在Java中創建一個單身這裏讀了起來:

Wikibooks Design Patterns: Java Singleton

基本上你不需要(也不應該)做所有的事情在類的靜態剛因爲你打算使用一些東西作爲單例。有幾個原因

從paxdiablo
  • 檢查答案和蒂洛
  • 也不要忘記讓所有的靜態不讓它單身您還需要刪除每一個構造函數(並默認構造函數私人)
+0

我不知道是否有必要使所有的構造函數都是私有的。你可以使用單例模式而不強制這個類永遠不會有其他用途。另外,公開可見的構造函數可以很好地處理DI等。 – Thilo 2009-11-20 01:33:11

相關問題