Java 什么是NetBeans;“收款退回”字段;可选警告?

Java 什么是NetBeans;“收款退回”字段;可选警告?,java,netbeans,collections,warnings,Java,Netbeans,Collections,Warnings,我在NetBeans中启用了尽可能多的可选警告,试图成为一名更好的程序员。其中之一是“收款字段的返回”。它的完整描述是“警告集合字段的返回” 这是什么意思?返回集合字段怎么可能有害?Java中的许多集合类,如ArrayList、HashSet和TreeMap都是可变的。这意味着您可以更改它们(例如,通过添加项目或清除项目)。这意味着您在编写不可变类时必须小心,因为集合字段的getter会返回一个副本 例如,您应该执行以下操作: public final class Example {

我在NetBeans中启用了尽可能多的可选警告,试图成为一名更好的程序员。其中之一是“收款字段的返回”。它的完整描述是“警告集合字段的返回”


这是什么意思?返回集合字段怎么可能有害?

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);
    }
}
公共最终类示例{
私人最终名单;
公共示例(列表@Sahuagin
为了防止这种情况,您可以使用

public List<Integer> getList() {
    return Collections.unmodifiableList(list);
}
public List getList(){
返回集合。不可修改列表(列表);
}

可能指的是
集合的易变性
@SotiriosDelimanolis您能详细说明一下吗?您正在泄漏字段所属对象的状态。如果您在检索集合后修改该集合,您可能会破坏该对象的状态。啊,这是有意义的。这不应该是一个问题,因为我只是u在集合子类中使用
返回此;
,以便可以链接命令(如
collection.add(foo).add(bar).toArray()
).Related:@Supuhstar I wish
ArrayList
就是这样工作的。当你添加一个项目时,
true
的返回值是完全无用的。返回一个列表的副本也不太好。当你实际将项目添加到一个临时对象时,你可能会认为你正在将项目添加到对象的集合中。你真的想要什么应该做的是为该类型(以及您需要公开的任何其他类型的特定函数)编写
addItem
removieItem
方法。这应该是一个注释,而不是回答,欢迎。虽然您的回答肯定是正确的,但它并没有解决“为什么返回集合被认为有害”的原始问题。我昨天发现了这一点。您也可以返回
Iterable
引用而不是
List
,然后客户端将知道他们无法修改集合。否则,它看起来像一个列表,但如果您尝试使用它,它只会抛出异常,这是不好的。
Iterable
unmodifiableList
可以很好地配合使用她试图解决这个问题。