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();
}
}