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编译器就不能改变代码的意义了。当您需要一个新实例时,它必须提供它 通常的易读性/性能权衡。但是创建一个新对象并没有那么长。