我想感受 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/

    10-10 06:50