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的才行。