[英]Singleton class only has static fields and methods but has many instances in the memory
[英]when is a singleton class preferred over a class that has only static methods?
什么時候單例類比僅具有靜態方法和私有默認構造函數的類優先?
請投票。
什么時候單例類比僅具有靜態方法和私有默認構造函數的類優先?
當您需要一個實例時 。 例如,作為方法參數傳遞。
使用單例來更好地控制初始化發生的時間。 對於靜態類,任何初始化都必須在類加載時進行,而您幾乎無法控制。 例如,對靜態最終MEMBER的簡單引用將觸發類加載。 使用單例,初始化可以被推遲到很晚以后-通常,直到第一次使用。
延遲初始化的原因可能是:
使用單例來提高可測試性。 如果您需要為單例創建某種模擬對象(廣義上)以測試其客戶端,則一種方法是使用其接口,並提供不同類的測試單例但實現相同的接口。
使用單例也使初始化測試更加容易。
當您可能需要調試初始化時,請使用單例。 來自靜態初始化的堆棧跟蹤可能令人困惑。 調試也可能令人費解。 如果該類過早加載,則它可能在甚至擊中main()第一行中的斷點之前就中斷了。
如果您有某種狀態需要存儲,那么單例是可行的方法。 例如,如果您的類需要從屬性文件中加載某些配置。
僅擁有靜態方法的主要原因是,您只需要一個工具箱即可將某些功能打包在一起。
我使用單例主要有兩個原因:
靜態方法不是動態方法,這與單例類實例大不相同。 因此,如果您需要從類擴展並重寫某些方法,則第二種方法將行不通。
第二種方法,您可能需要使用一些靜態引用,這可能會導致內存泄漏。
我會說單例類僅在以下情況下才是首選:當您要存儲系統范圍內的某些配置時,很少(如果有的話)需要刷新。
作為我的意思的示例,我的一個應用程序中有一個單例模式,它表示用戶互聯網連接的NAT設備。 此應用程序僅供桌面使用,因此很少(如果有的話)看到互聯網連接發生變化。 大概用戶可以將筆記本電腦搬到新的位置,並且情況會有所變化; 但是,有一種方法可以在此事件中重新創建狀態,但是這種狀態很少更改,可能需要花費幾秒鍾來初始化。
這需要保持昂貴,不經常更改的狀態,並且全局適用的狀態最好由應用程序范圍的Bean(我的首選)或單例模式Bean來完成。 靜態方法不能很好地保存這種狀態,盡管您也可以使用靜態字段來完成此操作以創建偽單例。 (不確定是否有更好的名稱-可能)
通常,我的建議是如果可以避免,則不要使用類似單例的模式,因為這樣會使重用更加困難。 如果您使用的是CDI框架,請在應用程序級別對bean進行范圍划分,以便於重新使用。 (這可能不是您的擔心-否則,您可以放心地忽略此建議)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.