java.util.Collections
当前提供以下实用程序方法来为各种收集接口创建synchronized
包装器:synchronizedCollection(Collection<T> c)
synchronizedList(List<T> list)
synchronizedMap(Map<K,V> m)
synchronizedSet(Set<T> s)
synchronizedSortedMap(SortedMap<K,V> m)
synchronizedSortedSet(SortedSet<T> s)
类似地,它也有6个unmodifiedXXX
重载。
明显的遗漏是NavigableMap<K,V>
的实用方法。确实是extends SortedMap
,但是SortedSet extends Set
,Set extends Collection
和Collections
都有专用的SortedSet
和Set
实用程序方法。大概NavigableMap
是一个有用的抽象,否则它本来就不会出现的,但是还没有实用的方法。
所以问题是:
为什么Collections
不为NavigableMap
提供实用程序方法有特定原因吗?
您将如何为synchronized
编写自己的NavigableMap
包装器?
瞥一眼source code for OpenJDK version of Collections.java
似乎表明这只是一个“机械”过程
通常,您可以像这样添加synchronized
线程安全性功能吗?
如果是这样的机械过程,可以自动化吗? (Eclipse插件等)
是否需要重复此代码,还是可以通过其他OOP设计模式来避免?
最佳答案
这是一个疏忽。 The fix is in progress。
乔希写道:
“他们绝对属于那里。他们的缺席是无意的。
我们应该尽快将它们放入。”
我同意,即使我们没有一个工程师期待
编写(和测试)所有那些令人麻木的转发方法。
发表日期:2006-08-21 00:50:41.0
不过要花一点时间。
更新:关于手动实现它,您可以考虑劫持java.util
包,因为您想扩展声明为私有包的static class SynchronizedSortedMap<K, V>
。否则,将会有很多代码复制粘贴。这是一个开始:
package java.util;
import java.util.Collections.SynchronizedSortedMap;
public class NewCollections {
public static <K, V> NavigableMap<K, V> synchronizedNavigableMap(NavigableMap<K, V> m) {
return new SynchronizedNavigableMap<K, V>(m);
}
static class SynchronizedNavigableMap<K, V> extends SynchronizedSortedMap<K, V> implements NavigableMap<K, V> {
private final NavigableMap<K, V> sm;
SynchronizedNavigableMap(NavigableMap<K, V> m) {
super(m);
sm = m;
}
SynchronizedNavigableMap(NavigableMap<K, V> m, Object mutex) {
super(m, mutex);
sm = m;
}
}
}
让IDE自动生成
NavigableMap
的未实现方法,并像SynchronizedSortedMap
一样对它们进行编码。这是一个示例: @Override
public K ceilingKey(K key) {
synchronized (mutex) { return sm.ceilingKey(key); }
}
请注意,返回例如
Set
的方法也需要将其包装在SynchronizedSet
中。再次,请参见SynchronizedMap
和SynchronizedSortedMap
源以获取见解:)我不希望它是机械过程,因为它涉及很多因素。