Software Construction Series

Posted Haruna_K

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Software Construction Series相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

软件构造复习内容--Process and Tools of Software Construction

software construction in Java Lab6

software construction第一章第二节 软件开发的质量属性

代码大全2 chapter1 Welcome to Software Construction

HIT Software Construction Lab6引发出来对锁的问题的探究

Browse W3C's Open Source Software