2013-01-15 63 views
1

如果我將類'A'定義爲單例表示,我只能創建類「A」的一個對象。如果我將它作爲Serializable並將其序列化,那麼如何實現同一對象的Singleton狀態?如何維護序列化對象上的Singleton狀態?

+0

如何序列化過程中交織與辛格爾頓概念,你的意思? – Andremoniy

+0

如果我序列化任何對象意味着我保存了對象的狀態,然後我反序列化它,我得到具有相同狀態的新對象,但它仍然是一個新對象,所以我如何才能實現Singleton狀態?所以有兩個對象,一個是序列化的,另一個是上下文。 – Amol

+0

在對任何對象進行反序列化之前,一個被調用的方法是readResolve,因此我們可以簡單地從該方法返回相同的對象。 – Amol

回答

1

任何對象一個方法的反序列化之前被稱爲是的readResolve(),所以我們可以簡單地從該方法返回相同的狀態對象不實際反序列化它。

請參考下面,

public final class MySingleton { 
    private MySingleton() { } 

    private static final MySingleton INSTANCE = new MySingleton(); 

    public static MySingleton getInstance() { return INSTANCE; } 

    private Object readResolve() throws ObjectStreamException { 
    // instead of the object we're on, 
    // return the class variable INSTANCE 
    return INSTANCE; 
    } 

}

1

爲了保證一個Serializable單身的唯一性,您可能需要自定義readResolve方法來返回單例對象而不是新反序列化的對象。在另一方面,書「有效的Java」 Item77認爲:

例如控制,寧願枚舉類型的readResolve

+0

是的多數民衆贊成真正我只是想這一個,之前任何對象反序列化一個方法被調用是readResolve,所以我們可以簡單地從這個方法返回相同的對象。非常感謝。 – Amol

+0

@AmolFasale的權利。但我強烈建議您閱讀「Effective Java」(第2版)Item77(第287頁)。 –

+0

@惠正謝謝。 – Amol

3

引用Effective Java #77,你應該看看實施readResolve方法。

readResolve功能允許用另一個實例代替readObject [Serialization,3.7]創建的一個 。如果正在反序列化的對象的類定義了具有正確聲明的readResolve方法,則在對新創建的對象進行反序列化後,該方法將調用 。然後返回由此方法返回的對象引用 而不是新創建的對象。在 此功能的大多數用途中,不保留對新創建對象的引用,因此它立即變爲符合垃圾回收的條件。

public class Elvis implements Serializable { 
public static final Elvis INSTANCE = new Elvis(); 
// readResolve for instance control - you can do better! 
private Object readResolve() { 
//Return the one true Elvis and let the garbage collector 
// take care of the Elvis impersonator. 
return INSTANCE; 
} 
} 
+0

感謝Manoj,這真的很有幫助。 – Amol