Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 即使有可变成员,我如何使这个类不可变?_Java_List_Immutability - Fatal编程技术网

Java 即使有可变成员,我如何使这个类不可变?

Java 即使有可变成员,我如何使这个类不可变?,java,list,immutability,Java,List,Immutability,我想使下面的类不可变,即使它有一个可变的列表成员。我怎样才能做到这一点 class MyImmutableClass { private List<Integer> data; public MyImmutableClass(List<Integer> data) { this.data = data; } public List<Integer> getData() {

我想使下面的类不可变,即使它有一个可变的列表成员。我怎样才能做到这一点

class MyImmutableClass {
        private List<Integer> data;
        public MyImmutableClass(List<Integer> data) {
            this.data = data;
        }
        public List<Integer> getData() {
            return data;
        }
    }

O/p:
数据为空;[2,5,3]

getData
方法中,而不是返回对
列表的引用,如

public List<Integer> getData() {
    return data;
}
有关更多详细信息,请参阅

已更新

正如user949300所指出的,您还应该复制原始列表

public MyImmutableClass(List<Integer> data) {
    this.data = new ArrayList<Integer>(data);
}
公共MyImmutableClass(列表数据){
this.data=新的ArrayList(数据);
}

这将阻止任何有权访问原始列表的人对其进行修改。

在构造函数中,转到

this.data=Collections.unmodifiableList(新的ArrayList(数据))

为了完整性和清晰性,请将数据字段声明为
final

如果正在使用,可以将
MyImmutableClass.data
的类型更改为


注意:我是Eclipse集合的提交人。

-1很抱歉,我不得不修改这个列表,因为传递列表的调用者仍然可以修改列表。查看我的答案。@user949300+1查看您的答案,如果没有其他原因看到初始错误的话……我正在Nook上键入,因此我的答案中缺少详细的解释,您的答案将是赢家。另外,您的是一个很好的答案。这是番石榴
ImmutableList
的一个很好的用例。是的。问题是,是否希望
列表
不被
MyImmutableClass
类修改。有时,您希望容器类能够修改数据,但不允许直接从外部进行修改……我不完全理解您的测试用例。如果类是不可变的,则不能添加3。此外,在成员变量上添加
final
。您从@MadProgrammer获得了一个很好的答案,但这可能在将来对您有所帮助:。它将允许您编写一个单元测试来检查您的类是否是不可变的,并指导您如何修复它。免责声明:我写的:)
public List<Integer> getData() {
    return Collections.unmodifiableList(data);
}
public MyImmutableClass(List<Integer> data) {
    this.data = new ArrayList<Integer>(data);
}
class MyImmutableClass {
    private ImmutableList<Integer> data;
    public MyImmutableClass(List<Integer> data) {
        this.data = Lists.immutable.withAll(data);
    }
    public ListIterable<Integer> getData() {
        return data;
    }
}
class MyImmutableClass {
    private MutableList<Integer> data;
    public MyImmutableClass(List<Integer> data) {
        this.data = Lists.mutable.withAll(data);
    }
    public ListIterable<Integer> getData() {
        return data.asUnmodifiable();
    }
}