4

変更可能な 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]

4

3 に答える 3

6

コンストラクターで、

this.data = Collections.unmodifiableList(new ArrayList(data));

完全性と明確性のために、データ フィールドを として宣言しますfinal

于 2013-09-05T03:53:20.360 に答える
2

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 のImmutableListand型は契約上不変です。つまり、 andメソッドListIterableはありません。このように、返されるリストを変更できないことは、 の戻り値の型から明らかです。add()remove()getData()

との両方ImmutableListMutableList拡張することで、API を変更せずにListIterable実装を から変更不可能なリストに変更できます。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 コレクションのコミッターです。

于 2013-09-06T15:57:19.183 に答える