为了账号安全,请及时绑定邮箱和手机立即绑定

用它制作一个新的ArrayList时如何修改Collections.unmodi?

用它制作一个新的ArrayList时如何修改Collections.unmodi?

侃侃尔雅 2021-05-05 17:42:09
我有一个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;

}


查看完整回答
反对 回复 2021-05-19
  • 2 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信