簡體   English   中英

在對象中設置數據集后對其進行修改

[英]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相同列表的引用。

我認為有兩種選擇:

  • setter方法只保存引用(如您的代碼中一樣)
  • setter方法進行預防性復制

我在開發人員生活中經常看到的方法是保存參考。 如果要進行預防性復制,我認為應該在javadoc中。 也有人總是返回列表的不變版本,以防止修改對象的狀態。 選擇更多地是關於您在這里做什么。 如果不信任您的代碼調用者,則進行預防性復制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM