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

2022-09-01 19:02:52

在该类中,列表元素的对象数组被定义为包私有:java.util.ArrayList

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

注释指出,此字段不是私有的原因是在嵌套类中更容易访问。但是,嵌套类可以访问封闭类的私有数据就好了。那么为什么不是私有的呢?后台是否发生了某些事情(例如,在编译时)?elementData


答案 1

从嵌套类访问私有字段时,编译器实际上会生成一个包可见的综合访问器方法,然后将其用于访问。它无法直接访问私有成员,因此为了避免这种间接寻址,您可以改为使成员包可见。

以下是包含更多详细信息的答案


答案 2

这种评论已经过时了。随着这个JEP的引入,编译器将不再创建语法方法;这是在 中引入的。jdk-11

在进行更改之前,对于像 这样高度使用的结构,问题在于调用堆栈中的另一种方法(用于访问该字段)在关键路径中可能具有很高的成本。要避免再调用一个方法,可以在不带 的情况下声明该字段。ArrayListprivateprivate