單例模式和靜態(tài)方法之間基本的區(qū)別是非常重要的奥此,前者給你一個Object,后者僅僅提供靜態(tài)方法稚虎,由于對像比方法具有較強的能力,可以指導你什么時候使用單例模式與靜態(tài)方法
Java中單例與靜態(tài)的區(qū)別
- 靜態(tài)類比單例具有更好的性能序攘,因為靜態(tài)方法在編譯期綁定
- 再次鸭限,它們的區(qū)別是override的能力两踏,因Java中的靜態(tài)方法是不可以覆蓋的,這就導致其木有太多的靈活性梦染,另一面,你可通過繼承的方式覆蓋單例類中定義的方法
- 靜態(tài)類很難模擬泛粹,因此難于單例測試,單例更容易模擬晶姊,因為也比靜態(tài)類易于編寫單元測試伪货,不論神馬單例期望神馬,你都可以傳遞模擬對象碱呼,例如構造方法或方法參數(shù)
- 如果你的需求中需要維護狀態(tài)信息,則單例比靜態(tài)類更適合愚臀,因為后者在維護狀態(tài)信息方面是非常可怕的馋袜,并導致狡滑的bug
- 如果是一個非常重的對象,單例可以懶加載欣鳖,但是靜態(tài)類沒有這樣的優(yōu)勢捧毛,并且非常熱切的加載
- 許多依賴注入的框架對單例都有良好的管理观堂,例如Spring呀忧,使用它們非常容易