java api之实现(下)

http://tech.ddvip.com   2006年11月23日    社区交流

本文详细介绍java api之实现(下)

Collection c = Collections.synchronizedCollection(myCollection);
synchronized(c) {
Iterator i = c.iterator(); // Must be in the synchronized block!
while (i.hasNext())
foo(i.next());
}

   在一个同步 Map 的 Collection视图上的迭代惯用程序与上述程序相似,但有一个诀窍,那就是,当在同步 Map 的Collection视图上迭代时, 用户必须对同步 Map 做手工同步,而不是对 Collection视图本身做同步:

Map m = Collections.synchronizedMap(new HashMap());
...
Set s = m.keySet(); // Needn"t be in synchronized block
...
synchronized(m) { // Synchronizing on m, not s!
Iterator i = s.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}

   包装器实现的一个小的缺陷是你不能执行一个包装器实现的非接口操作。因此,比如在上面的 List 的例子中,你就不能调用包装的ArrayList上的ensureCapacity 操作。

  不可变包装器(Unmodifiable Wrappers)

  从概念上讲,不可变包装器与同步包装器是相似的,但它要更简单。它不是在包装的 对象集 上增加功能,而是减少功能。特别是,它取消了更改 对象集 的功能;办法是截取所有那些要更改 对象集 的操作,并扔出一个UnsupportedOperationException。 不可变包装器有两个主要用途:

  使一个对象集在一旦建立后就不可在改变。针对这种情况,不保持对后备 对象集 的引用是一个好的做法。它可以绝对保证不可变性。

  允许"二等公民(second-class citizens)" 对你的数据结构的只读访问。你可以保持对后备 对象集 的引用,但施舍一个对包装器的引用。用这样的办法,二等公民可以看,但不能触动,而你可以保持全面的存取。

责编:豆豆技术应用

正在加载评论...