簡體   English   中英

什么時候單例類優於僅具有靜態方法的類?

[英]when is a singleton class preferred over a class that has only static methods?

什么時候單例類比僅具有靜態方法和私有默認構造函數的類優先?

請投票。

什么時候單例類比僅具有靜態方法和私有默認構造函數的類優先?

當您需要一個實例時 例如,作為方法參數傳遞。

使用單例來更好地控制初始化發生的時間。 對於靜態類,任何初始化都必須在類加載時進行,而您幾乎無法控制。 例如,對靜態最終MEMBER的簡單引用將觸發類加載。 使用單例,初始化可以被推遲到很晚以后-通常,直到第一次使用。

延遲初始化的原因可能是:

  • 它很貴,而且您在該課程中並不總是需要它
  • 您必須先初始化一些其他資源(例如,數據庫連接),然后才能進行初始化。 在這種情況下,懶惰實例化的單例通常會提供正確的操作順序,而沒有任何顯式的控制-如果在其他資源初始化之后才引用它,則所有操作都是免費的。

使用單例來提高可測試性。 如果您需要為單例創建某種模擬對象(廣義上)以測試其客戶端,則一種方法是使用其接口,並提供不同類的測試單例但實現相同的接口。

使用單例也使初始化測試更加容易。

當您可能需要調試初始化時,請使用單例。 來自靜態初始化的堆棧跟蹤可能令人困惑。 調試也可能令人費解。 如果該類過早加載,則它可能在甚至擊中main()第一行中的斷點之前就中斷了。

如果您有某種狀態需要存儲,那么單例是可行的方法。 例如,如果您的類需要從屬性文件中加載某些配置。

僅擁有靜態方法的主要原因是,您只需要一個工具箱即可將某些功能打包在一起。

我使用單例主要有兩個原因:

  1. 構造對象真的很昂貴(時間或內存),我只想做一次。
  2. 與該類關聯的數據在該類的每個實例中都必須相同。

靜態方法不是動態方法,這與單例類實例大不相同。 因此,如果您需要從類擴展並重寫某些方法,則第二種方法將行不通。

第二種方法,您可能需要使用一些靜態引用,這可能會導致內存泄漏。

我會說單例類僅在以下情況下才是首選:當您要存儲系統范圍內的某些配置時,很少(如果有的話)需要刷新。

作為我的意思的示例,我的一個應用程序中有一個單例模式,它表示用戶互聯網連接的NAT設備。 此應用程序僅供桌面使用,因此很少(如果有的話)看到互聯網連接發生變化。 大概用戶可以將筆記本電腦搬到新的位置,並且情況會有所變化; 但是,有一種方法可以在此事件中重新創建狀態,但是這種狀態很少更改,可能需要花費幾秒鍾來初始化。

這需要保持昂貴,不經常更改的狀態,並且全局適用的狀態最好由應用程序范圍的Bean(我的首選)或單例模式Bean來完成。 靜態方法不能很好地保存這種狀態,盡管您也可以使用靜態字段來完成此操作以創建偽單例。 (不確定是否有更好的名稱-可能)

通常,我的建議是如果可以避免,則不要使用類似單例的模式,因為這樣會使重用更加困難。 如果您使用的是CDI框架,請在應用程序級別對bean進行范圍划分,以便於重新使用。 (這可能不是您的擔心-否則,您可以放心地忽略此建議)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM