gpt4 book ai didi

java - Guava:copyOf() 方法的 ImmutableList 魔法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:41:28 24 4
gpt4 key购买 nike

想感受一下Guava guava-librariescopyOf()方法的“魔力”。

有一个我用来检查它的小应用程序。

这是 documentation :

The JDK provides Collections.unmodifiableXXX methods, but in our opinion, these can be

  • unwieldy and verbose; unpleasant to use everywhere you want to make defensive copies
  • unsafe: the returned collections are only truly immutable if nobody holds a reference to the original collection

因此,我尝试构建一个模型,其中 “有人持有对原始集合的引用”。因此,使用集合的副本时,我不应该担心改变副本的值(value)。但是到目前为止魔术还没有奏效(尝试了两次:1. copyOf(collection), 2. copyOf(iterator)):

import com.google.common.collect.ImmutableList;

import java.util.LinkedList;
import java.util.List;

class MyObject {
String name;
public MyObject(String name) {this.name = name;}
@Override
public String toString() {
return name;
}
}

public class ListUnsafe {

List<MyObject> list = new LinkedList<MyObject>();
{
list.add(new MyObject("a"));
list.add(new MyObject("b"));
list.add(new MyObject("c"));
}

public List<MyObject> getList() {
return ImmutableList.copyOf(list);
}

public List<MyObject> getCopyIterator() {
return ImmutableList.copyOf(list.iterator());
}

public static void main(String[] args) {

ListUnsafe obj = new ListUnsafe();
{
MyObject ref = obj.list.get(0);

List<MyObject> myList = obj.getList();

MyObject copyObj = myList.get(0);
copyObj.name = "new";

System.out.println("ref: " + ref);
}

obj = new ListUnsafe();
{
MyObject ref = obj.list.get(0);

List<MyObject> myList = obj.getCopyIterator();

MyObject copyObj = myList.iterator().next();

copyObj.name = "new";

System.out.println("ref: " + ref);

}

}

}

输出:

ref: new
ref: new

这意味着我们更改了原始数据。我们不想要的。

问题

为什么不复制?
它与 unmodifiableXXX 有何不同?

link类似的问题:

关于 copyOf 的答案是这样的:

  • (来自源代码)copyOf(Collection) 实例不会创建临时 ArrayList(copyOf(Iterable)copyOf(迭代器)这样做)。

最佳答案

  1. ImmutableList 不会神奇地使元素 不可变;不能修改的是列表,而不是它包含的元素。
  2. ImmutableList.copyOf 制作一个副本,除非它正在复制一个 已经 ImmutableList 的列表。如果您为同一个不可变列表调用两次 ImmutableList.copyOf(list),您将获得两个不同的副本。

关于java - Guava:copyOf() 方法的 ImmutableList 魔法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16765240/

24 4 0