java - 编译器是否优化了不添加/覆盖方法的匿名类?

标签 java android coding-style

我想知道编译器(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 等),这就像我的编码风格/习惯之一。

因此问题:

  1. 编译器是否优化了这种语法? (即它意识到不需要生成匿名类,Snippet B 的性能将与 Snippet A 相同)

  2. 如果 (1) 的答案是“否”,我想知道(由于这种编码风格,匿名类的数量超出预期)是否会产生显着影响因此强烈建议对于 future 的项目(为普通移动 设备编写应用程序代码)我们应该始终坚持代码段 A 中的样式?

    <

最佳答案

是的,它会(总是)生成一个匿名类(称为 Human$1)。您可以通过检查输出的类文件来了解这一点。你应该有一个 Human.class 和 Human$1.class 作为输出。

至于性能影响,将有两个类(更大,VM 的工作更多),从一个到另一个的引用(因为匿名内部类将链接到外部类)。我想这可能会对性能产生影响,但影响很小。您必须对其进行测试。

但是,以这种方式执行它并不是特别惯用的 java。惯用的方法是使用另一个构造函数。

关于java - 编译器是否优化了不添加/覆盖方法的匿名类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8011656/

相关文章:

java - 用有限的值使两个数组和相同

java - 无法使用 Quarkus 找到请求目标的有效认证路径

安卓蓝牙打印

java - 无法在 android studio 中启动新项目,显示 IDE 错误

c++ - 检测 C++ 代码样式问题的工具?

functional-programming - 什么是 "point free"风格(在函数式编程中)?

java - 返回一个实现接口(interface)的私有(private)类,保持实现私有(private)

java - Java 中泛型作为函数内的对象

Android:requestCode 和 resultCode

ruby - 哪个是 Ruby 中最好/最常用的单例编码约定?