我想感受一下copyOf()
番石榴方法的‘魔力’ guava-libraries
。
我用一个小应用程序来检查它。
这是文档:
JDK 提供了
Collections.unmodifiableXXX
方法,但在我们看来,这些可以是
- 笨拙且冗长;在你想制作防御性副本的任何地方使用都不愉快
- 不安全:只有在没有人持有对原始集合的引用时,返回的集合才是真正不可变的
所以,我尝试建立一个模型,其中"someone holds a reference to the original collection"
. 因此,使用收藏副本时,我不应该担心改变副本的价值。但是到目前为止魔法不起作用(有两次尝试: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
?
有类似问题的链接:
答案说copyOf
:
- (来自源)
copyOf(Collection)
实例不会创建临时ArrayList
(copyOf(Iterable)
并且copyOf(Iterator)
这样做)。