完美单身
我不時遇到一些Java程序員,他們不確定他們應該如何正確實現Singleton模式。 (如果您不知道什么是Singleton,請嘗試Wikipedia: Singleton模式 )。 困難的方式(或者您使用1.4或更舊的Java)
您需要在Singleton類中實現readResolve方法。 這個小東西用來覆蓋已創建的序列化機制。 您返回的內容將用于代替序列化產生的數據(有關詳細信息,請參見: Serializable Javadoc )。 只需在此處返回您的實例: ...protected Object readResolve() throws ObjectStreamException {return INSTANCE;} ... 簡單方法(是的,我使用的是1.5或更高版本)
將您的單例類更改為枚舉,并刪除私有構造函數和getInstance方法。 是的,就是這么簡單。 然后,您可以免費獲得它。 public enum SafeSingleton implements Serializable {INSTANCE; }
我并不是在談論在線程環境中的正確實現。 但是,使用最常見的實現,您可以在Internet上找到所需的內容,從而可以輕松創建任意多個單例。
試想一下,您有以下常見的單例實現:
public final class NonSafeSingleton implements Serializable {private static final NonSafeSingleton INSTANCE = new NonSafeSingleton();private NonSafeSingleton() {}public static NonSafeSingleton getInstance() {return INSTANCE;} }現在專注于可序列化單詞。 再想一秒鐘…是的,您是對的。 如果您通過RMI發送這些東西,您將獲得第二實例。 甚至需要執行一些內存序列化,反序列化和kaboom操作! 您剛剛取消了一般的Singleton合同。 那不太好。 但是如何解決呢? 通常,我使用兩種方法:
您需要在Singleton類中實現readResolve方法。 這個小東西用來覆蓋已創建的序列化機制。 您返回的內容將用于代替序列化產生的數據(有關詳細信息,請參見: Serializable Javadoc )。 只需在此處返回您的實例: ...protected Object readResolve() throws ObjectStreamException {return INSTANCE;} ...
將您的單例類更改為枚舉,并刪除私有構造函數和getInstance方法。 是的,就是這么簡單。 然后,您可以免費獲得它。 public enum SafeSingleton implements Serializable {INSTANCE; }
在實施下一個Singleton時,請記住這一點。 如果大量使用RMI,可以使您的生活更輕松。
參考:來自我們的JCG合作伙伴 Marek Piechut的《完美單身漢》,在《 發展世界》中 。
相關文章 :- Java中可怕的雙重檢查鎖定成語
- Java Secret:使用枚舉構建狀態機
- 依賴注入–手動方式
- Java泛型快速教程
- JVM如何處理鎖
翻譯自: https://www.javacodegeeks.com/2011/08/perfect-singleton.html
總結
- 上一篇: Xuggler教程:转码和媒体修改
- 下一篇: 小鹏汽车 8 月交付 13690 台:同