次のように、変更不可能なリストを返すゲッターがあります。
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);
}
}
これらのコードを実行すると、元の製品リストが変更されます。誰かが正確に何が起こったのか説明してもらえますか? また、変更不可能なリストを変更しないようにするにはどうすればよいでしょうか?