今天工作中碰到一个clone的问题
為什么80%的碼農都做不了架構師?>>> ??
今天開發中遇到一個問題:
需要將一個對象進行clone,對他的副本的屬性進行修改,供一個特定的對象使用,完成某個需求。
平時對java的clone看的不是很多,相當然的使用了Object的clone()方法:
SomObject obj = new SonObject();
SomObject objClone =obj.clone();
結果發現更新obj的某個成員變量的時候(ArrayList),objClone中的成員變量也相應的發生變化!但是obj.hashCode() 卻不等于objClone.hashCode(),說明他們并沒有指向同一個對象!看到這個結果一下子蒙了,這是為什么呢??
仔細想了一下,恍然大悟:java中的clone是淺拷貝,只是拷貝對象本身,以及基本數據類型,對于對象的非基本數據類型變量,比如ArrayList等,并不進行拷貝!
---------
public class SomObject implements Cloneable{
??? private List wifeList;
??? private int count;
??? ....
??? public Object clone(){
??? ??? try{
??? ??? ??? return super.clone();
??? ??? }catch(....){
??? ??? ??? ....
??? ??? }
??? ??? return null;
??? }
}
SomObject obj = new SomObject();
obj.setCount(1);
obj.setWifeList(new ArrayList("Beautifule"));
SomObjec cloneObj = (SomObject)obj.clone();
obj.setCount(2);
obj.setWifeList(new ArrayList("Tender"));
System.out.println(obj.getCount());//結果 2
System.out.println(obj.getWifeList().get(0));//Tender
System.out.println(cloneObj.getCount());//結果 1
System.out.println(cloneObj.getWifeList().get(0));//Tender
深度clone
??? public Object clone(){
??????? try{
??????? ?SomObject s = (SomObject)super.clone;
??????? ?s.wifeList = (ArrayList)wifeList.clone;
??????????? return s;
??????? }catch(....){
??????????? ....
??????? }
??????? return null;
??? }
轉載于:https://my.oschina.net/play/blog/4511
總結
以上是生活随笔為你收集整理的今天工作中碰到一个clone的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电子商城
- 下一篇: Inkscape导出xaml