我想使以下类不可变,即使它具有可变的List成员。我怎样才能做到这一点?
class MyImmutableClass {
private List<Integer> data;
public MyImmutableClass(List<Integer> data) {
this.data = data;
}
public List<Integer> getData() {
return data;
}
}
下面是测试类,其
main()
函数可修改对象状态。class TestMyImmutableClass{
public static void main(String[] args) {
List<Integer> data = new ArrayList<Integer>();
data.add(2);
data.add(5);
MyImmutableClass obj = new MyImmutableClass(data);
obj.getData().add(3);
System.out.println("Data is; " + obj.getData());
}
}
O/P:
Data is; [2, 5, 3]
最佳答案
如果您使用的是Eclipse Collections,则可以将MyImmutableClass.data
的类型更改为 ImmutableList
。
class MyImmutableClass {
private ImmutableList<Integer> data;
public MyImmutableClass(List<Integer> data) {
this.data = Lists.immutable.withAll(data);
}
public ListIterable<Integer> getData() {
return data;
}
}
Eclipse Collection的
ImmutableList
和ListIterable
类型在契约上是不可变的,这意味着它们没有add()
和remove()
方法。这样,从getData()
的返回类型可以明显看出,返回的列表无法更改。ImmutableList
和MutableList
都扩展了ListIterable
,因此您可以在不更改API的情况下将实现从ImmutableList
更改为不可修改的列表。class MyImmutableClass {
private MutableList<Integer> data;
public MyImmutableClass(List<Integer> data) {
this.data = Lists.mutable.withAll(data);
}
public ListIterable<Integer> getData() {
return data.asUnmodifiable();
}
}
注意:我是Eclipse集合的提交者。