1. 程式人生 > >Software Construction Series(2)

Software Construction Series(2)

應對 匹配 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)