【问题标题】:Is this code optimized by compiler这段代码是否由编译器优化
【发布时间】:2014-06-16 08:31:25
【问题描述】:

我经常写下面这样的代码。

class SomeClass {
    private final Executor executor = new Executor();

    void doSomething() {
        executor.execute(new ExecutionListener() {
             public void onEnd() {
                 onExecutionEnd();
             }
        });
    }

    private void onExecutionEnd() {
        // Do something    
    }
}

问题是每次我调用executor.execute 时都会创建一个新的侦听器实例,并且所有实例每次都在做同样的事情。在现实世界中,手机游戏中使用了类似的代码,doSomething 方法会为许多SomeClass 实例调用多次,对于这种情况和环境,每次都创建一个new 实例并不是一个好主意。因此,为了避免创建新实例,我将代码更改为此。

class SomeClass {
    private Executor executor = new Executor();

    private final ExecutionListener executionListener = new ExecutionListener() {
         public void onEnd() {
             onExecutionEnd();
         }
    };

    void doSomething() {
        executor.execute(executionListener);
    }

    private void onExecutionEnd() {
        // Do something    
    }
}

我发现第一个代码更具可读性,但第二个似乎更优化。我想知道编译器是否会进行这种优化。它可以以某种方式检测到每个侦听器实例都会做同样的事情,而是创建一个新实例,它可以将其存储为类成员。

PS:我知道,让SomeClass 实现侦听器接口并将this 传递给execute 方法是一种选择,但我不希望SomeClass 的消费者可以访问侦听器方法。

【问题讨论】:

  • 通常的易读性/性能权衡。不过创建一个新对象并不长。

标签: java compiler-optimization


【解决方案1】:

答案是否定的。没有实现的机制可以静态检查分析此类代码。那么Java编译器无法改变代码的意义。如果您需要一个新实例,它必须提供它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 2023-03-05
    • 2014-06-07
    相关资源
    最近更新 更多