我正在尽可能多地在NetBeans中启用可选警告,以期成为更好的编码器。其中之一是“收藏场回归”。它的整个描述是“警告收集领域的回归”。 The Wiki wasn't any more helpful.
这是什么意思?如何返回收集字段会有害吗?
答案 0 :(得分:2)
Java中的许多集合类,例如ArrayList
,HashSet
和TreeMap
都是可变的。这意味着您可以更改它们(例如,通过添加项目或清除它们)。这意味着在编写不可变类时必须小心,集合字段的getter返回副本。
例如,你应该这样做:
public final class Example {
private final List<Integer> list;
public Example(List<? extends Integer> list) {
this.list = new ArrayList<Integer>(list);
}
public List<Integer> getList() {
return new ArrayList<Integer>(list);
}
}
如果getList()
只是简单地说return list;
,则调用者本身会引用私有字段list
,因此对返回的对象所做的任何更改都会改变{{1}的实例。 1}}。
当你写Example
之类的东西时,这个警告可能会告诉你。我的建议是保留该可选警告,因为它可以非常容易地编写return list;
而不用思考,结果可能非常混乱。
答案 1 :(得分:1)
@Sahuagin 为防止这种情况,您可以使用
public List<Integer> getList() {
return Collections.unmodifiableList(list);
}