这是Java SynchronizedCollection类中的错误吗?

Mor*_*Adi 7 java collections

有一个内部类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)