有一个内部类SynchronizedCollection - 在java.util.Collections里面有两个构造函数.第一个采用集合,另一个采用集合和互斥.前构造函数检查参数是否为空.但后来不要!这是实施.
SynchronizedCollection(Collection<E> c) {
if (c==null)
throw new NullPointerException();
this.c = c;
mutex = this;
}
SynchronizedCollection(Collection<E> c, Object mutex) {
this.c = c;
this.mutex = mutex;
}
Run Code Online (Sandbox Code Playgroud)
使用此实现,我可以通过向第二个构造函数发送null来打破类不变量.
我相信它应该是这样的:
SynchronizedCollection(Collection<E> c) {
this(c,this)
}
SynchronizedCollection(Collection<E> c, Object mutex) {
if (c==null)
throw new NullPointerException();
this.c = c;
this.mutex = mutex;
}
Run Code Online (Sandbox Code Playgroud)
但是我无法说服自己Josh Bloch和Neal Gafter看不到这一点.你能真的告诉我我错过了什么吗?
编辑:可能的攻击
Map<String, String> m = new Map<String, String>(){
@Override
public int size() {
// TODO Auto-generated method stub
return 0;
}
.
.
.
@Override
public Collection<String> values() {
return null;
}
};
Map<String, String> synchronizedMap = Collections.synchronizedMap(m);
Collection<String> values = synchronizedMap.values();
Run Code Online (Sandbox Code Playgroud)
men*_*urg 11
当然这是一个错误.两个构造函数应该是一致的,要么都应该抛出异常,要么都不应该抛出.
这已在Java 8中修复.现在两个构造函数都将抛出异常:
SynchronizedCollection(Collection<E> c) {
this.c = Objects.requireNonNull(c);
mutex = this;
}
SynchronizedCollection(Collection<E> c, Object mutex) {
this.c = Objects.requireNonNull(c);
this.mutex = Objects.requireNonNull(mutex);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
358 次 |
最近记录: |