1

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

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

4

3 回答 3

3

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

egobj.getList().clear();将清除 obj 内的列表(假设 getList() 返回一个私有成员),但如果 getList() 返回一个传递给 Collections.unmodifiableList 的列表,则将引发异常

于 2013-09-13T12:28:43.310 回答
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;
}
于 2013-09-13T12:31:19.643 回答
2

它有两个主要优点:

  1. 在编码时,您可以在不创建子类的情况下创建只读集合类,您可以在每种类型的集合上使用通用只读包装器(可重用性)
  2. 在运行时,您可以创建现有集合的只读视图,而无需将整个集合复制到只读实现(这通常很昂贵)

当您想要阻止您的班级用户修改您自己的内部集合时,后者通常很有用。

如今,组合优于继承也被认为是好的设计,它非常适合这种模式。

示例 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);
     }
}
于 2013-09-13T12:24:22.833 回答