java.util.Collections当前提供以下实用程序方法来synchronized为各种收集接口创建包装器:
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重载。
unmodifiedXXX
明显的遗漏是这里的实用方法NavigableMap<K,V>。的确如此extends SortedMap,但SortedSet extends Setand Set extends Collection和and 确实Collections有专用于SortedSetand的实用程序方法Set。大概NavigableMap是一个有用的抽象,否则它本来就不会存在的,但是还没有实用的方法。
NavigableMap<K,V>
extends SortedMap
SortedSet extends Set
Set extends Collection
Collections
SortedSet
Set
NavigableMap
所以问题是:
Collections.java
这是一个疏忽。该修复程序正在进行中。
乔希写道: “他们绝对属于那里。他们的缺席是无意的。 我们应该尽快将它们放进去。” 我同意,即使我们当中没有一个工程师期望编写(和测试)所有这些令人麻木的转发方法。发表日期:2006-08-21 00:50:41.0
乔希写道:
“他们绝对属于那里。他们的缺席是无意的。 我们应该尽快将它们放进去。”
我同意,即使我们当中没有一个工程师期望编写(和测试)所有这些令人麻木的转发方法。发表日期:2006-08-21 00:50:41.0
不过要花一点时间。
更新 :关于手动实现它,您可以考虑劫持该java.util软件包,因为您想扩展static class SynchronizedSortedMap<K, V>声明为私有的软件包。否则,将会有很多代码复制粘贴。这是一个开始:
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。这是一个示例:
SynchronizedSortedMap
@Override public K ceilingKey(K key) { synchronized (mutex) { return sm.ceilingKey(key); } }
请注意,例如返回的方法也Set需要将其包装SynchronizedSet。再次,请参阅SynchronizedMap和SynchronizedSortedMap参考资料以获取见解:)
SynchronizedSet
SynchronizedMap
我不希望它是机械过程,因为它涉及很多因素。