我想感受 Guava copyOf()
的guava-libraries
方法的“魔力”。
我有一个小应用程序来检查它。
这是documentation:
因此,我尝试构建"someone holds a reference to the original collection"
的模型。因此,使用 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(Iterator)
这样做)。 最佳答案
ImmutableList
不会神奇地使元素不变。这是无法修改的列表,而不是其中包含的元素。 ImmutableList.copyOf
进行复制,除非它正在复制已经是ImmutableList
的列表。如果您为相同的不可变列表两次调用ImmutableList.copyOf(list)
,您将获得两个不同的副本。 关于java - Guava :copyOf()方法的ImmutableList魔术,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16765240/