为什么 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.SubList
是 static
并访问 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
.
在 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
.
并且至少 class ArrayList.SubList
是 static
并访问 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
.