java高級工程師面試問題集結號(two)

###單例模式的優缺點java

  • 實現要點 Singleton模式是限制而不是改進類的建立。 Singleton類中的實例構造器能夠設置爲Protected以容許子類派生。 Singleton模式通常不要支持Icloneable接口,由於這可能致使多個對象實例,與Singleton模式的初衷違背。 Singleton模式通常不要支持序列化,這也有可能致使多個對象實例,這也與Singleton模式的初衷違背。 Singleton只考慮了對象建立的管理,沒有考慮到銷燬的管理,就支持垃圾回收的平臺和對象的開銷來說,咱們通常不必對其銷燬進行特殊的管理。 理解和擴展Singleton模式的核心是「如何控制用戶使用new對一個類的構造器的任意調用」。 能夠很簡單的修改一個Singleton,使它有少數幾個實例,這樣作是容許的並且是有意義的。
  • 優勢 實例控制:Singleton 會阻止其餘對象實例化其本身的 Singleton 對象的副本,從而確保全部對象都訪問惟一實例 靈活性:由於類控制了實例化過程,因此類能夠更加靈活修改實例化過程
  • 缺點 開銷:雖然數量不多,但若是每次對象請求引用時都要檢查是否存在類的實例,將仍然須要一些開銷。能夠經過使用靜態初始化解決此問題,上面的五種實現方式中已經說過了。 可能的開發混淆:使用 singleton 對象(尤爲在類庫中定義的對象)時,開發人員必須記住本身不能使用 new 關鍵字實例化對象。由於可能沒法訪問庫源代碼,所以應用程序開發人員可能會意外發現本身沒法直接實例化此類。 對象的生存期:Singleton 不能解決刪除單個對象的問題。在提供內存管理的語言中(例如基於 .NET Framework 的語言),只有 Singleton 類可以致使實例被取消分配,由於它包含對該實例的私有引用。在某些語言中(如 C++),其餘類能夠刪除 對象實例,但這樣會致使 Singleton 類中出現懸浮引用。
  • 適用性 當類只能有一個實例並且客戶能夠從一個衆所周知的訪問點訪問它時。 當這個惟一實例應該是經過子類化可擴展的,而且客戶應該無需更改代碼就能使用一個擴展的實例時。

腦部枚舉類的單例模式的優勢

public enum EasySingleton{ INSTANCE; }安全

1:枚舉本身處理序列化線程

傳統單例存在的另一個問題是一旦你實現了序列化接口,那麼它們再也不保持單例了,由於readObject()方法一直返回一個新的對象就像java的構造方法同樣,你能夠經過使用readResolve()方法來避免此事發生,看下面的例子:對象

//readResolve to prevent another instance of Singleton private Object readResolve(){ return INSTANCE; }接口

這樣甚至還能夠更復雜,若是你的單例類維持了其餘對象的狀態的話,所以你須要使他們成爲transient的對象。可是枚舉單例,JVM對序列化有保證。內存

2:枚舉實例建立是thread-safe開發

正如在第一條中所說的,由於建立枚舉默認就是線程安全的,你不須要擔憂double checked locking。內存管理

總結:枚舉單例有序列化和線程安全的保證,並且只要幾行代碼就能實現是單例最好的的實現方式,不過你仍然可使用其它的方式來實現單例,可是我仍然得不到一個更有信服力的緣由不去使用枚舉。若是你有的話,不妨告訴我。event

相關文章
相關標籤/搜索