我想知道编译器(ECJ、javac,或者你可以命名为你最喜欢的编译器)是否优化了匿名类,这些匿名类不添加或重写它的基类的方法。
例如,对于看起来像这样的代码:
fragment A:
Human h = new Human("John", 30);
h.setX(12.5);
h.setY(15.3);
//..
Eat(h);
我总是更喜欢语法:
fragment B:
Eat(new Human("John", 30){
{
setX(12.5);
setY(15.3);
//..
}
});
不过我知道,与 vb.net 中的 WITH
关键字不同,这不仅仅是语法糖。我们告诉编译器要做的是创建一个 Human 的匿名子类,其构造函数由括号内的代码组成(这也是为什么我们不能对最终类使用这种语法糖)。
现在的问题是我一直在使用这种语法糖(例如在 UI 监听器中覆盖 onclick 等),这就像我的编码风格/习惯之一。
因此问题:
编译器是否优化了这种语法? (即它意识到不需要生成匿名类,Snippet B 的性能将与 Snippet A 相同)
如果 (1) 的答案是“否”,我想知道(由于这种编码风格,匿名类的数量超出预期)是否会产生显着影响因此强烈建议对于 future 的项目(为普通移动 设备编写应用程序代码)我们应该始终坚持代码段 A 中的样式?
<
最佳答案
是的,它会(总是)生成一个匿名类(称为 Human$1)。您可以通过检查输出的类文件来了解这一点。你应该有一个 Human.class 和 Human$1.class 作为输出。
至于性能影响,将有两个类(更大,VM 的工作更多),从一个到另一个的引用(因为匿名内部类将链接到外部类)。我想这可能会对性能产生影响,但影响很小。您必须对其进行测试。
但是,以这种方式执行它并不是特别惯用的 java。惯用的方法是使用另一个构造函数。
关于java - 编译器是否优化了不添加/覆盖方法的匿名类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8011656/