我有一個(gè)getter,它返回一個(gè)不可修改的列表,例如:public List<Product> getProductList() { if (productList == null) return new ArrayList<>(); return Collections.unmodifiableList(productList);}我這樣稱(chēng)呼這個(gè)吸氣劑:List<Product> productList = new ArrayList<>(report.getProductList());然后,我將此列表傳遞給另一個(gè)修改列表的方法,如下所示:for (Product product : productList) { product.addToAdvisoryList(advisory);}其中addToAdvisoryList(Advisory advisory)是:public void addToAdvisoryList(Advisory advisory) { if (advisoryList == null) { setAdvisoryList(Collections.singletonList(advisory)); } else if (!isContainedAdvisory(advisoryList, advisory)) { List<Advisory> newAdvisoryList = new ArrayList<>(advisoryList); newAdvisoryList.add(advisory); setAdvisoryList(newAdvisoryList); }}運(yùn)行這些代碼后,原始產(chǎn)品列表將被修改。有人可以解釋到底發(fā)生了什么嗎?以及如何避免修改不可修改的列表?
2 回答

侃侃無(wú)極
TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
您的列表包含可變的Product對(duì)象。
您無(wú)需修改任何列表。列表包含對(duì)相同可變對(duì)象的引用,并且您正在對(duì)這些對(duì)象進(jìn)行更改?;旧鲜呛鸵郧耙粯拥睦蠁?wèn)題
為避免這種情況,您可以getProductList返回一份副本列表。另外,您可以使Product類(lèi)不可變,這將迫使您重新考慮您的方法。
public List<Product> getProductList() {
List<Product> copies = new ArrayList<>();
for (Product product: productList)
copies.add(new Product(product)); // add this constructor
return copies;
}
添加回答
舉報(bào)
0/150
提交
取消