java - 为什么 CopyOnWriteArrayList 使用 getArray() 来访问数组引用?

标签 java copyonwritearraylist

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

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

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

最佳答案

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

但是,我认为主要原因是文体。

  • array 变量声明为private

  • getArray 方法声明为私有(private)包,注释如下:

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

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

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

关于java - 为什么 CopyOnWriteArrayList 使用 getArray() 来访问数组引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47030394/

相关文章:

java - 与 R.java 文件中与 string_name 关联的 id 相比,R.string.string_name 生成不同的 id

java.io.IOException : Stream closed ZipInputStream

java - 为什么CopyOnWriteArrayList中没有这样的removeRange()方法?

java - CopyOnWriteArrayList 上线程中的迭代器不起作用

java - 支柱|类型转换错误

java - ListView 和全局变量

java - 如何在 Android 设备中从 Firestore 获取服务器时间戳?

java - CopyOnWriteArrayList 可以帮助允许从已放入迭代器的不同线程中删除项目

java - Android 中指向相同对象或数据的 ArrayList

java - 在基本数据结构的List上,修改操作线程安全吗?CopyOnWriteArrayList吗?