Thi*_*ilo 12 java performance inner-classes micro-optimization
当我有私有方法或字段的内部类时,编译器必须创建合成的包受保护的访问器方法,以允许外部类访问这些私有元素(反之亦然).
为了避免这种情况,我通常会将所有字段和方法以及构造函数保护为包而不是私有.
但是班级本身的知名度如何呢?有没有开销
private static class A {
A(){}
}
Run Code Online (Sandbox Code Playgroud)
与
static class A {
A(){}
}
Run Code Online (Sandbox Code Playgroud)
请注意,构造函数在两种情况下都是受包保护的,或者是否使类私有更改?
Mic*_*yan 18
您是否尝试过编译它并比较字节代码?这是我的结果.对于:
public class Example {
public static void main(String[] args) {
System.out.println("Hello world!");
}
private static class A {
A(){}
}
}
Run Code Online (Sandbox Code Playgroud)
以上产生以下*.class文件:
-rw-r--r-- 1 michaelsafyan staff 238 Feb 10 00:11 Example$A.class
-rw-r--r-- 1 michaelsafyan staff 474 Feb 10 00:11 Example.class
Run Code Online (Sandbox Code Playgroud)
现在,如果我移动类文件,删除private修饰符,并重新编译,我得到:
-rw-r--r-- 1 michaelsafyan staff 238 Feb 10 00:15 Example$A.class
-rw-r--r-- 1 michaelsafyan staff 474 Feb 10 00:15 Example.class
Run Code Online (Sandbox Code Playgroud)
如果查看类文件上的VM Spec,您将看到有一个用于指定访问修饰符的常量大小的位字段,因此生成的文件大小相同并不奇怪.
简而言之,您的访问修饰符不会影响生成的字节代码的大小(它也不会对性能产生任何影响).您应该使用最有意义的访问修饰符.
我还应该补充说,如果将内部类从声明更改static为未声明static,则会有一些细微差别,因为它意味着引用外部类的附加字段.这将占用比你声明内部类更多的内存static,但你为此进行优化是疯狂的(使用static它有意义的地方,以及你需要它非静态的地方,使它非静态,但不要只是为了在这里或那里保存一个内存指针而使你的设计卷入其中.
私有内部类和非私有内部类之间应该没有性能差异.
静态内部类(私有或非私有)与外部类之间应该没有性能差异.
静态内部类和非静态内部类之间存在小的性能差异.这种差异是由于非静态情况对其封闭类的实例具有隐藏引用.它作为额外参数传递给内部类构造函数,并存储在隐藏变量中.