我的程序中有以下代码:
...
private void generateStack() {
List<AdvertisementsModel> adsForModel = Storage.getAdsForId(model.getId());
...
adsForModel.clear();
...
Storage
是具有静态字段和方法的静态类。 generateStack
方法位于另一个类和实例对象中。如果 asdForModel
引用不是最终的,为什么 adsForModel.clear();
会影响 Storage
类中的列表?
最佳答案
Storage.getAdsForId(...)
返回对相同 List
的引用的副本目的。因此,通过此引用进行的调用会产生相同的列表。当您调用Storage.getAdsForId
时没有创建新列表 - 只是对同一列表的新引用。
因此,最好显式返回 ImmutableList
或者制作 Storage.getAdsForId(...)
中列表的防御性副本并返回副本。
请注意,当 AdvertisementsModel
时,您需要进行深复制。是可变的,否则你会在不同的层面上遇到同样的问题。 (否则您现在可能有一个列表副本,但两个列表仍然包含对相同 AdvertisementsModel
对象的引用,并且更改它们仍然会影响 Storage
内的列表内容。)
关于java - 为什么局部非最终变量会影响引用的字段? java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15198898/