为什么 java.util.ArrayList 包中的数据数组是私有的?

Why is the data array in java.util.ArrayList package-private?

java.util.ArrayList class 中,列表元素的对象数组定义为 package-private:

transient Object[] elementData; // non-private to simplify nested class access

评论指出此字段不是私有的原因是在嵌套 classes 中更容易访问。但是,嵌套的 classes 可以很好地访问封闭的 class 的私有数据。那么为什么 elementData 不是私有的呢?后台有什么事情发生吗(例如,在编译时)?

当您从嵌套的 class 访问私有字段时,编译器实际上会生成一个包可见的 synthetic accessor method,然后将其用于访问。它不能直接访问私有成员,因此为了避免这种间接访问,您可以改为使成员包可见。

这里 an answer 有更多详细信息。

However, nested classes can access private data of the enclosing class just fine

对于 static.

的嵌套 classes 不成立

并且至少 class ArrayList.SubListstatic 并访问 elementData.

另见此处: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

正如@tevemadar 向我表明的那样,我在这里声明的内容完全错误。 这是@tevemadar 提供的一个工作示例:

public class Test
{
    private int a = 0;

    public static void main(String[] args)
    {
        new Inner().doTest(new Test());
    }

    static class Inner
    {
        void doTest(Test t)
        {
            System.out.println(t.a);
        }
    }
}

该评论已过时。随着 this JEP 的引入,编译器将不再创建句法方法;这是在 jdk-11.

中介绍的

改变之前,像ArrayList这样的高度使用的结构的问题是调用堆栈中的另一个方法(用于访问private 字段)可能会在关键路径中产生高成本。为了避免再调用一种方法,您可以声明字段 without private.