2016-01-06 48 views
0

我想創建一個類: - 只有一個實例 - 在我的應用程序的所有生命週期中都可以訪問。 - 類不必由垃圾收集器銷燬。創建java類無法通過GC收集

我可以通過使用靜態或單例模式來實現此目的嗎?

感謝

+0

單身人士應該這樣做。 –

回答

2

確保不能被垃圾回收的方式是確保它保持可達。你可以:

  • 是指它在另一個類,也可到達,
  • 負載它在最初的類加載器(這將永遠是可達),
  • 把類的實例到一個變量仍然可到達,
  • 等等。

在實踐中,除非你的類使用您自己創建一個類加載器動態加載,這是不可能類將被卸載/由GC破壞。


在另一方面......如果你真的關心一個單實例(不是)收集被垃圾,正常執行Singleton設計模式的採用的是護理:

public class MySingleton { 
    private static Integer instance = new Integer(42); 

    public static Integer getInstance() { 
     return instance; 
    } 
} 

static變量是可到達的,只要該MySingleton類保持可達...這通常是爲應用程序運行的壽命;往上看。

A public static變量也可以工作,儘管從其他角度來看它是一個壞主意。

+0

感謝您的信息。 –

3

您可以使用一個enum單

class MySingleton implements MyInterface { 
    INSTANCE; 

    // methods 
} 

理想的情況下這樣的單身應該是無狀態的。有狀態的單身人士很難/很容易出現單元測試。

如果它不是無狀態的,我建議使用依賴注入來代替。即在應用程序加載時創建對象一次,並將其傳遞給所有需要它的實例。