Software Construction Series(2)

Collections.unmodifiable*()与Rep Exposure

JDK在collections接口中提供了一类静态函数:collections.unmodifiable*(),其中*匹配Collections的子类。

如图:

简而言之:这类函数返回一个相应对象的不可更改的Copy。

问题在于不可更改性到那种程度:

1、相当于final?(即reference不可变)

2、相当于imutable?(即集合本身内容不可变,其中元素仍可变)

3、相当于can't do anything?(即集合本身不可变,其中元素不可变)

做了如下测试:

package tests;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class list_test {
  List<Pair> list = new ArrayList<>();

  public void add(Pair a) {
    list.add(a);
  }

  public Pair get(int i) {
    return list.get(i);
  }

  public List<Pair> getUnmodified() {
    return Collections.unmodifiableList(list);
  }



  public static void main(String[] args) {
    list_test a = new list_test();

    Pair x = new Pair(1, 1);
    a.add(x);

    List<Pair> u = a.getUnmodified();
    u.get(0).Set(0, 0);
    System.out.println(u.get(0).getX() + "," + u.get(0).getY());
    System.out.println(a.get(0).getX() + "," + a.get(0).getY());

    try {
      u.add(x);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}


class Pair {
  private int x;
  private int y;

  public Pair(int x, int y) {
    this.x = x;
    this.y = y;
  }


  public void Set(int x, int y) {
    this.x = x;
    this.y = y;
  }

  public int getX() {
    return x;
  }

  public int getY() {
    return y;
  }
}

Output:

0,0
0,0
java.lang.UnsupportedOperationException
	at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055)
	at tests.list_test.main(list_test.java:36)

分析:

unmodifiable的效果为2,相当于imutable(即集合本身内容不可变,其中元素仍可变)。

所以对于要防止数据泄露, 不仅要返回一个unmodifiable的集合对象,还需要其中的元素也是imutable的才行。

posted @ 2018-04-02 20:55  Haruna_K  阅读(129)  评论(0编辑  收藏  举报