【问题标题】:Why CopyOnWriteArrayList use getArray() to access an array reference?为什么 CopyOnWriteArrayList 使用 getArray() 来访问数组引用?
【发布时间】:2017-10-31 07:56:58
【问题描述】:

几乎所有 CopyOnWriteArrayList 中的方法都使用 getArray() 直接调用数组。这种行为有原因吗? 例如:

public int size() {
    return getArray().length;
}

    public int indexOf(Object o) {
    Object[] elements = getArray();
    return indexOf(o, elements, 0, elements.length);
}

【问题讨论】:

  • @AxelH 它没有。这是一个简单的包私有最终方法,带有return array;。可能是一些与 JMM 相关的优化之类的。
  • 我确实说过这是一个一般性答案 ...我没有提到这个具体案例。但是,如果由于任何原因需要更新类,并发性,不变性,......这将更简单在getArray 中执行此操作,而不是使用数组的每个方法。所以我猜这个方法的开发者有点偏执
  • @AxelH 该类是 Doug Lea 的 java.util.concurrent 的一部分。这很可能有一个很好的理由。
  • @Kayaman 副本并没有真正回答问题,直接在现场操作会达到完全相同的效果。解释的“巫毒”与调用getArray 和/或setArray 无关。
  • 参见stackoverflow.com/questions/28772539/… 以讨论相关的setArray() 方法。它是内存模型巫毒,可能与编译器/JIT/其他优化有关,不幸的是,Doug Lea 没有对代码进行评论,具体原因。但是,它们肯定是有目的的,它与直接访问数组不同。链接问题中的 Stuart Marks 是从事 Java 内存模型和相关工作的人之一(与 Brian Goetz 和其他人一起)。

标签: java copyonwritearraylist


【解决方案1】:

“他们为什么要这样设计”问题总是一个猜想的问题。这个也是……除非代码的作者(Doug Lea)向我们解释他的想法。

但是,我认为主要原因是风格。

  • array 变量声明为private

  • getArray 方法被声明为包私有并带有注释:

    // Gets the array. Non-private so as to also be accessible 
    // from CopyOnWriteArraySet class. 
    

如果没有方法,则需要将array 变量本身声明为包私有。我认为(我怀疑 Doug 也认为)包私有 getter 比包私有字段好得多。 (出于所有标准原因。)如果 getter 和 setter 存在,那么使用它们是合理的。

相关问题 (Why setArray() method call required in CopyOnWriteArrayList) 解释了为什么在明显不必要的地方会调用 setArray。但这是一个正交问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2017-08-08
    相关资源
    最近更新 更多