收集副本

Art*_*sov 3 java collections

你通常如何用Java收集getter?例如,我有两个班级.

public class A
{
    String s = "1";
    A () {}
}

public class B
{
     List<A> list;
     public B()
     {
       list = new ArrayList<>();
     }
     public List<A> getList()
     {
        return list;
     }

}
Run Code Online (Sandbox Code Playgroud)

如果我喜欢这样的话,我可以这样做:

B elem = new B();
elem.getList().add(new A());
Run Code Online (Sandbox Code Playgroud)

所以它打破了吸气剂的想法.

我可以

 public List<A> getList()
 {
     return new ArrayList<>(list);
 }
Run Code Online (Sandbox Code Playgroud)

但是,如果我修改结果的某些元素,原始元素将被更改.

Tun*_*aki 5

返回不可修改的集合Collection.unmodifiableList(list):

public List<A> getList() {
    return Collections.unmodifiableList(list);
}
Run Code Online (Sandbox Code Playgroud)

引用Javadoc:

返回指定列表的不可修改视图.此方法允许模块为用户提供对内部列表的"只读"访问.对返回列表的查询操作"读取"到指定的列表,并尝试修改返回的列表,无论是直接还是通过其迭代器,都会导致UnsupportedOperationException.

因此,无法在返回的列表中追加/删除元素,也无法修改其元素.

如果要返回列表的深层克隆而不是不可修改的列表,请参阅此问题.