2012-07-26 44 views
0

我有這樣的:複製整個對象在內存

import java.util.ArrayList; 


public class MyClass { 
    ArrayList list = new ArrayList(); 

    public MyClass(){ 

    } 

    public MyClass(MyClass aClass){ 
     this.list = aClass.getList(); 
    } 

    public void add(int number){ 
     list.add(number); 
    } 

    public void set(int number){ 
     list.set(0, number); 
    } 

    public int get(){ 
     return (Integer)list.get(0); 
    } 

    public ArrayList getList(){ 
     return list; 
    } 
} 



MyClass aName = new MyClass(); 
aName.add(5); 
System.out.println("aName: "+aName.get()); 

MyClass aName2 = new MyClass(aName); 
System.out.println("aName2: "+aName2.get()); 

aName2.set(1); 
System.out.println("aName2: "+aName2.get()); 
System.out.println("aName: "+aName.get()); 

這將打印: aName:5 aName2:5 aName2:1 aName:1

我不希望我的第二個對象改變我的第一個對象的值。 有什麼辦法可以阻止這種情況發生,但仍然可以從其他對象複製屬性?

+2

您需要製作內部ArrayList的副本,而不僅僅分配參考。例如'this.list = aClass.getList()。clone()' – nhahtdh 2012-07-26 19:37:54

+0

爲什麼你要回滾自己的數組列表? – Wug 2012-07-26 19:41:39

+0

@wug他不是,它圍繞數組列表創建行爲。 – corsiKa 2012-07-26 19:43:18

回答

1

然後不從原來的對象到新對象傳遞的列表,在

public MyClass(MyClass aClass){ 
    this.list = aClass.getList(); 
} 

它使兩個對象具有到同一列表的引用(僅存在兩個對象之間共享的一個列表) 。

你應該做

public MyClass(MyClass aClass){ 
    this.list = (List) aClass.getList().clone(); 
} 
+0

檢查是否有必要強制轉換,因爲clone()返回Object。 – nhahtdh 2012-07-26 19:40:21

+0

你是對的,謝謝。更新。 – SJuan76 2012-07-26 19:45:30

1

是的,你可以阻止這一切。您需要在複製構造函數中使列表的防禦副本

public MyClass(MyClass aClass){ 
    this.list = new ArrayList(aClass.getList()); 
} 

你可以使用clone(),但喬希布洛赫有效的Java項目規定「的拷貝構造函數在clone有許多優勢」 - 他們在實踐中優選的。

1

你可以克隆()或獲取副本,但既然你已經創建了一個列表,而不是放棄它,你可以使用它。 ;)

public MyClass(MyClass aClass){ 
    this.list.addAll(aClass.getList()); 
} 
+2

的確如此,他正在申報中創建一個。 「最終」變量有用的另一個原因 - 這會在編譯時檢測到這個錯誤! – corsiKa 2012-07-26 19:44:43

0

你複製ArrayList參考值到您的新對象。現在您有兩個對同一個列表的引用。

您需要創建一個新的ArrayList當你構建你的第二個對象:

public MyClass(MyClass aClass){ 
    this.list = new ArrayList(aClass.getList()); 
} 

注意,但是,這兩個列表現在包含相同的對象。同樣,這隻會創建一個新列表並複製原始列表中對象的引用值。如果您需要兩個包含唯一對象的完整且單獨的列表,則需要編寫一個進行深度複製的方法,並複製列表中的對象。