让我解释一下,我一直在阅读(难以置信)关于让你的收藏不可修改,看看封装收藏,这是一个有趣的想法,但我无法想象它的实际情况。
有人可以解释它的实际应用吗?
当您返回作为对象私有成员的列表时,它非常有用,因为从外部修改列表会破坏封装
egobj.getList().clear();
将清除 obj 内的列表(假设 getList() 返回一个私有成员),但如果 getList() 返回一个传递给 Collections.unmodifiableList 的列表,则将引发异常
只要您想安全地发布列表和/或强制执行不变性,就可以使用它。
例如:
// 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;
}
它有两个主要优点:
当您想要阻止您的班级用户修改您自己的内部集合时,后者通常很有用。
如今,组合优于继承也被认为是好的设计,它非常适合这种模式。
示例 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);
}
}