内部クラス SynchronizedCollection があります - java.util.Collections 内に 2 つのコンストラクターがあります。1 つはコレクションを取得し、もう 1 つはコレクションとミューテックスを取得します。以前のコンストラクターは、引数が null でないことを確認します。しかし、後者はしません!これが実装です。
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;
}
この実装では、null を 2 番目のコンストラクターに送信することで、クラスの不変条件を破ることができます。
私はそれが次のようなものであるべきだと信じています:
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;
}
しかし、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();