1、問題猜想,假如將乙個物件通過序列化放到乙個檔案後,再取出來看是否與本身相等?
publicclass hungrysingleton implements
serializable
private
hungrysingleton()
public
static
hungrysingleton getinstance()
}
public結果:class
test
}
com.wenwen.design.pattern.creational.singleton.hungrysingleton@45ee12a7由此可見,instance和newinstance不相等,就違背了單例模式的乙個初衷,通過序列化和反序列化拿到了不同的物件。而我們是希望拿到乙個物件。com.wenwen.design.pattern.creational.singleton.hungrysingleton@7699a589
false
那麼如何解決呢?
在單例中加乙個方法就可解決,如下**所示:
public再次執行測試類之後,結果如下:class hungrysingleton implements
serializable
private
hungrysingleton()
public
static
hungrysingleton getinstance()
private
object readresolve()
}
com.wenwen.design.pattern.creational.singleton.hungrysingleton@45ee12a7為什麼如此神奇呢?這就要大家深入看下原始碼了。按command+enter進行該處的原始碼。com.wenwen.design.pattern.creational.singleton.hungrysingleton@45ee12a7
true
因為使用了序列化,則會new乙個新的例項,所以前面看到會返回兩個不同的例項。
因為**裡寫了readresolve()方法,會反射出原先的例項進行返回,則寫了readresolve()方法之後,會返回同乙個例項。
單例模式5 1(序列化破壞單例)
之前見過可以通過反射來破壞單例,和如何防止被破壞。今天講一下序列化破壞單例。新建類 serializablesingletion,其實就是餓漢式單例,只是實現了serializable介面 public class serializablesingletion implements serializ...
單例模式,解決單例破壞。
破壞單例模式的三種方法 執行緒安全情況下 單例模式有 3 個特點 單例類只有乙個例項物件 該單例物件必須由單例類自行建立 單例類對外提供乙個訪問該單例的全域性訪問點。單例模式的優點和缺點 單例模式的優點 單例模式可以保證記憶體裡只有乙個例項,減少了記憶體的開銷。可以避免對資源的多重占用。單例模式設定...
單例模式及單例物件的可序列化
為了使乙個單例類變成可序列化的,僅僅在宣告中新增 implements serializable 是不夠的。因為乙個序列化的物件在每次返序列化的時候,都會建立乙個新的物件,而不僅僅是乙個對原有物件的引用。為了防止這種情況,可以在單例類中加入readresolve 方法。下面我們先簡要地回顧下物件的序...