【问题标题】:Purpose of overloaded constructor in SynchronizedMap classSynchronizedMap 类中重载构造函数的目的
【发布时间】:2018-11-22 13:51:09
【问题描述】:

Collections 类中,SynchronizedMap 类有两个构造函数。一个只使用map 实例,另一个使用mapmutex

    SynchronizedMap(Map<K,V> m) {
        this.m = Objects.requireNonNull(m);
        mutex = this;
    }

    SynchronizedMap(Map<K,V> m, Object mutex) {
        this.m = m;
        this.mutex = mutex;
    }

但是,SynchronizedMap 类是一个私有静态类,并且是使用提供的包装方法访问它的唯一方法:

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
    return new SynchronizedMap<>(m);
}

this link 了解到,第二个构造函数的想法是使用用户提供的mutex 而不是this。现在,既然 wrapper 方法是获取 SynchronizedMap 实例的唯一方法(它只接受一个地图对象),那么第二个重载构造函数的目的是什么?

【问题讨论】:

  • 似乎它让地图用户指定同步完成的对象(否则默认为地图实例本身)。
  • 下定决心。要么是静态的,要么是内在的。 static inner 用词自相矛盾。
  • @EJP 已编辑。我的意思是它的静态嵌套类。

标签: java collections


【解决方案1】:

它用于例如在 SynchronizedSortedMap 创建子图视图时扩展 SynchronizedMap

 public SortedMap<K,V> subMap(K fromKey, K toKey) {
            synchronized (mutex) {
                return new SynchronizedSortedMap<>(
                    sm.subMap(fromKey, toKey), mutex);
            }
        }

共享同一个互斥体。

【讨论】:

    猜你喜欢
    • 2015-03-30
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多