我有一个getter,它返回一个不可修改的列表,例如:public List<Product> getProductList() { if (productList == null) return new ArrayList<>(); return Collections.unmodifiableList(productList);}我这样称呼这个吸气剂:List<Product> productList = new ArrayList<>(report.getProductList());然后,我将此列表传递给另一个修改列表的方法,如下所示: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); }}运行这些代码后,原始产品列表将被修改。有人可以解释到底发生了什么吗?以及如何避免修改不可修改的列表?
2 回答
侃侃无极
TA贡献2051条经验 获得超10个赞
您的列表包含可变的Product对象。
您无需修改任何列表。列表包含对相同可变对象的引用,并且您正在对这些对象进行更改。基本上是和以前一样的老问题
为避免这种情况,您可以getProductList返回一份副本列表。另外,您可以使Product类不可变,这将迫使您重新考虑您的方法。
public List<Product> getProductList() {
List<Product> copies = new ArrayList<>();
for (Product product: productList)
copies.add(new Product(product)); // add this constructor
return copies;
}
添加回答
举报
0/150
提交
取消