2013-10-23 174 views
1

我只想出現開發人員可能需要使用Singleton類的用例。他們是: -爲什麼java.lang.Runtime是單身人士?單身人士的要求?

  1. 當我們需要維護資源之間的同步。對於日誌記錄情況下的 示例,多個線程需要依次寫入單個日誌文件 。這裏單身人士幫助,因爲在不同線程中需要同步 ,以便它們按順序寫入單個文件 。
  2. 當對象創建本身是昂貴的,這意味着它耗時操作的時間爲 。例如: - 啓動hibernate工廠創建 。我並不是說在任何情況下都是如此,但是在某些情況下,單身人士可以在此幫助,因爲在應用程序和對象創建之間共享相同的狀態需要使用 代價高昂。
  3. 在商業服務對象的情況下,單身人士可以提供幫助,因爲它會強制我們不保持對象的狀態,從而使得代碼更好地進行單元測試。

我的理解是否正確?

我正在尋找單例在jdk中的例子,並遇到了運行時類,並想到爲什麼這個單身?根據我的理解,理由應該是第一個。例如,我們需要同步,以便兩個線程不會在同一時刻運行GC。我的邏輯正確嗎?

+0

在同一個Java進程中實例化一個新的'Runtime'意味着什麼? –

+0

單身類型可以創建一個靜態類型的類,並將其轉換爲對象。好處是它現在可以被傳遞到事物中。 – Cruncher

+0

@JoshLee看看我的答案。這不是你的問題所暗示的嗎? =) –

回答

5

每個Java應用程序都有一個Runtime類的一個實例 允許與其中 應用程序運行環境的接口應用。

感覺直觀,因爲Java程序執行的環境是一個,靜態的東西是不會改變的,Runtime是單身。

即使你產生了越來越多的線程,處理器的數量,總RAM等也不會改變。因此,通過避免創建一個包含與1000個其他線程相同的信息的對象,使得單個實例可以優化程序的執行。

這是我對它的理解。

+0

在這種情況下,Runtome可以將所有方法都設置爲靜態而不是單例。不是嗎? –

-1

單身是邪惡的。他們真的是變相的全球變數。它們對於單元測試特別不利,因爲一旦單類被一個類加載器加載,它的行爲是固定的,所以你不能嘲笑它。您的代碼將被修復以永久調用該依賴關係。

更好的方法是使用依賴注入來將該依賴完全注入到需要的地方,或者通過代碼將依賴關係傳遞到需要的地方。

有讀:http://c2.com/cgi/wiki?SingletonsAreEvil

你也問自己,爲什麼你想使用一個單例。單例表示一個實例,但實際上每個類加載器意味着一個實例。這可能是也可能不是你真正想要的解決方案。

+1

+1,但每個規則都有例外。一個單例適用於'Runtime',因爲整個JVM只能有一個單例。 –

+1

這並不回答這個問題。它看起來像複製粘貼。 – dantuch

+0

這不是複製和粘貼。我首先詢問使用單身人士的理由。大多數時候你不需要單身人士,而且會導致比解決問題更多的問題。 另一點是,單身人士可以用作某種形式的優化,以防止重複創建昂貴的物體。如果採用依賴注入,這又是一個非問題。 –