猿问

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

我有一个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);

    }

}

运行这些代码后,原始产品列表将被修改。有人可以解释到底发生了什么吗?以及如何避免修改不可修改的列表?


侃侃尔雅
浏览 175回答 2
2回答

侃侃无极

您的列表包含可变的Product对象。您无需修改任何列表。列表包含对相同可变对象的引用,并且您正在对这些对象进行更改。基本上是和以前一样的老问题为避免这种情况,您可以getProductList返回一份副本列表。另外,您可以使Product类不可变,这将迫使您重新考虑您的方法。public List<Product> getProductList() {&nbsp; &nbsp; List<Product> copies = new ArrayList<>();&nbsp; &nbsp; for (Product product: productList)&nbsp; &nbsp; &nbsp; &nbsp; copies.add(new Product(product)); // add this constructor&nbsp; &nbsp; return copies;}
随时随地看视频慕课网APP

相关分类

Java
我要回答