这个方法有用吗Collections.unmodifiableList?

时间:2013-09-13 12:07:34

标签: java

让我解释一下,我一直在阅读(令人难以置信)关于让你的收藏品无法修改,看看encapsulate collections,这是一个有趣的想法,但我无法想象它的实际情况。

有人可以解释它的实际应用吗?

3 个答案:

答案 0 :(得分:3)

当您返回一个对象的私有成员列表时,它非常有用,因为从外部修改列表会破坏封装

e.g。 obj.getList().clear();将清除obj中的列表(asssuming getList()返回一个私有成员),但如果getList()返回一个传递给Collections.unmodifiableList的列表,则会抛出异常

答案 1 :(得分:2)

它有两个主要优点:

  1. 编码时,您可以创建只读集合类而不创建子类,您可以在每种类型的集合上使用通用的只读包装(可重用性)
  2. 在运行时,您可以创建现有集合的只读视图,而无需将整个集合复制到只读实现(通常很昂贵)。
  3. 当您想阻止类用户修改您自己的内部集合时,后者通常很有用。

    现在它也被认为是一种优秀的设计,可以很好地适应这种模式{/ 3}}。

    1的例子:

    class myComplicatedCollection<T> implements Collection<T> {
         // Code goes here
    
         // O no, I still have to deal with the read-only use-case.
         // Instead of duplicating almost all of my code or using inheritance I'll use this handy-dandy wrapper
         public Collection<T> readonlyVersion() {
              return Collections.unmodifiableCollection(this);
         }
    }
    

    2的例子:

    class myClass {
         private Collection<T> theData;
    
         // Users need to access the data,
         // but we don't want them modifying the private data of this class
         public Collection<T> getTheData() {
             return Collections.unmodifiableCollection(theData);
         }
    }
    

答案 2 :(得分:2)

每当您想要安全地发布列表和/或强制执行不变性时,请使用它。

例如:

// neither the reference nor the contents can change
private static final List<String> codes = Collections.unmodifiableList(Arrays.asList("a", "b", "c"));

此列表无法在班级内修改,可以安全发布:

// the caller can't change the list returned
public static List<String> getCodes() {
    return codes;
}