[英]Modifying a dataset after setting it in an Object
我有一個Java問題,但更多與面向對象有關。
public class A {
private List list;
public A() {
this.list = new ArrayList();
}
public List getList() {
return this.list;
}
public void setList(List new_list) {
this.list = new_list;
}
}
public class Main {
public static void main(String args[]) {
A a = new A();
List my_list = new ArrayList();
a.setList(my_list);
my_list.add("bla");
}
}
問題:是否允許調用者(在此示例中為main())假設setList(...)保存對List對象的引用?
具體來說-main()方法中的最后一行代碼-在my_list中添加“ bla”,並假設它也將添加到A對象的List中。
提前致謝。
答案是肯定的 。 默認情況下,Java中的每個分配都使用對象引用,但int
類的本機類型除外。
您正在處理引用,而不是實際對象。 因此,當您致電
List my_list = new ArrayList();
a.setList(my_list);
is stored in . 對的引用存儲在 。 object in your code and . 因此,在代碼和您具有同一對象的兩個引用。 現在,當你打電話
my_list.add(“ bla”);
object, which is being referred by also. “ bla”被添加到對象中,該對象也被 。 如果您將上述電話替換為
a.getList().add("bla");
您將得到相同的結果。
在您的代碼中,調用方( main
方法)具有對與類A
相同列表的引用。
我認為有兩種選擇:
我在開發人員生活中經常看到的方法是保存參考。 如果要進行預防性復制,我認為應該在javadoc中。 也有人總是返回列表的不變版本,以防止修改對象的狀態。 選擇更多地是關於您在這里做什么。 如果不信任您的代碼調用者,則進行預防性復制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.