原型模式的門道兒,沒有那么淺娃殖,至少我覺得特別多。
1萧锉,jdk的淺克隆clone及深克隆實(shí)現(xiàn)
2珊随,利用序列化與反序列化進(jìn)行深克隆
3,clone會(huì)破壞單例
4柿隙,transient關(guān)鍵字-指定屬性不序列化(保護(hù)敏感信息)
5,克隆的巧妙運(yùn)用-當(dāng)你需要使用remove方法移除掉集合中的對象鲫凶,而非要修改集合中的對象的時(shí)候禀崖,可以選擇使用。
6螟炫,使用json復(fù)制對象(Spring BeanUtils香香噠)
感謝這個(gè)資源時(shí)代波附,蠻多優(yōu)秀認(rèn)真的文章,這里更多的是搬運(yùn)和思考昼钻。
先來看看JDK的Object的clone接口源碼說明(原創(chuàng))
克隆(復(fù)制)在Java中是一種常見的操作然评,目的是快速獲取一個(gè)對象副本仅财。克隆分為深克隆和淺克隆碗淌。
淺克抡登蟆:創(chuàng)建一個(gè)新對象,新對象的屬性和原來對象完全相同亿眠,對于非基本類型屬性碎罚,仍指向原有屬性所指向的對象的內(nèi)存地址。
深克履上瘛:創(chuàng)建一個(gè)新對象荆烈,屬性中引用的其他對象也會(huì)被克隆,不再指向原有對象地址竟趾。
總之深淺克隆都會(huì)在堆中新分配一塊區(qū)域憔购,區(qū)別在于對象屬性引用的對象是否需要進(jìn)行克隆(遞歸性的)潭兽。
?推薦閱讀:java中的關(guān)鍵字transient倦始,這篇文章你再也不發(fā)愁了
1,transient關(guān)鍵字的作用山卦?
將不需要序列化的屬性前添加關(guān)鍵字transient鞋邑,序列化對象的時(shí)候诵次,這個(gè)屬性就不會(huì)被序列化。
2枚碗,transient底層實(shí)現(xiàn)原理是什么逾一?
serialization提供存儲對象狀態(tài)的機(jī)制(對象的狀態(tài)存儲到硬盤上),transient修飾的字段肮雨,他的生命周期僅僅在內(nèi)存中遵堵,不會(huì)被寫到磁盤中。
3怨规、被transient關(guān)鍵字修飾過得變量真的不能被序列化嘛陌宿?
不是。取決于對象實(shí)現(xiàn)哪個(gè)序列化接口(Serializable或Exteranlizable)波丰,后者可以自定義序列化壳坪。
4、靜態(tài)變量能被序列化嗎掰烟?沒被transient關(guān)鍵字修飾之后呢爽蝴?
靜態(tài)變量是不會(huì)被序列化的,即使沒有transient關(guān)鍵字修飾纫骑。
5蝎亚、妙用
銀行卡、密碼等敏感數(shù)據(jù)的