Java 这段代码是由编译器优化的吗

Java 这段代码是由编译器优化的吗,java,compiler-optimization,Java,Compiler Optimization,我经常写下面这样的代码 class SomeClass { private final Executor executor = new Executor(); void doSomething() { executor.execute(new ExecutionListener() { public void onEnd() { onExecutionEnd(); }

我经常写下面这样的代码

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时,都会创建一个新的listener实例,所有实例每次都在做同样的事情。在现实世界中,手机游戏中使用了类似的代码,并且对许多
SomeClass
实例多次调用了
doSomething
方法,每次为此类实例和环境创建一个
新的
实例不是一个好主意。所以,为了避免创建新实例,我将代码更改为

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
来实现监听器接口,并将
这个
传递给
execute
方法是一个选项,但我不希望监听器方法可以从
SomeClass
的消费者那里访问。答案是否定的。没有实现机制来检查静态分析这样的代码。那么Java编译器就不能改变代码的意义了。当您需要一个新实例时,它必须提供它

通常的易读性/性能权衡。但是创建一个新对象并没有那么长。