我经常编写如下代码。
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}}。
答案 0 :(得分:2)
答案是否定的。没有实现的机制可以检查静态分析这些代码。然后Java编译器无法改变代码的意义。如果您需要新实例,它必须提供它。