Software Construction Series(2)
阿新 • • 發佈:2018-04-02
應對 匹配 source void () string tun enc 其中
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的才行。
Software Construction Series(2)