我想使以下类不可变,即使它具有可变的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的ImmutableListListIterable类型在契约上是不可变的,这意味着它们没有add()remove()方法。这样,从getData()的返回类型可以明显看出,返回的列表无法更改。
ImmutableListMutableList都扩展了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集合的提交者。

10-02 00:49