此代码是否由编译器优化

时间:2014-06-16 08:31:25

标签: java compiler-optimization

我经常编写如下代码。

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方法是一种选择,但我不希望可以从{{的消费者访问监听器方法1}}。

1 个答案:

答案 0 :(得分:2)

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