java - 为什么局部非最终变量会影响引用的字段? java

标签 java reference pass-by-reference

我的程序中有以下代码:

...
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/

相关文章:

c - 通过引用将字符串数组传递给 C 函数 - 无效指针

C++ 模板和工厂

vba - Excel VBA - 引用写入公式的单元格

rust - 如何对不可变值进行可变引用

c++ - 通过引用符号传递

c++ - 在函数内部初始化 unsigned char 指针返回空指针

java - 如何在java应用程序中设置垂直选取框?

java - 如何使用 ImageView 调用电话?

java - 使用 spring-ldap 1.3.1 禁用 Active Directory 服务器的 SSL 证书验证

java - 使用 BlueJ 将 24 时钟更改为 12 时钟