让我解释一下,我一直在阅读(令人难以置信)关于让你的收藏品无法修改,看看encapsulate collections,这是一个有趣的想法,但我无法想象它的实际情况。
有人可以解释它的实际应用吗?
答案 0 :(得分:3)
当您返回一个对象的私有成员列表时,它非常有用,因为从外部修改列表会破坏封装
e.g。 obj.getList().clear();
将清除obj中的列表(asssuming getList()返回一个私有成员),但如果getList()返回一个传递给Collections.unmodifiableList的列表,则会抛出异常
答案 1 :(得分:2)
它有两个主要优点:
当您想阻止类用户修改您自己的内部集合时,后者通常很有用。
现在它也被认为是一种优秀的设计,可以很好地适应这种模式{/ 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;
}