#java #compiler-optimization
#java #оптимизация компилятора
Вопрос:
Я часто пишу код, подобный приведенному ниже.
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, и все экземпляры каждый раз делают одно и то же. В реальном мире аналогичный код используется в мобильной игре, и 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
.
Комментарии:
1. Обычный компромисс между удобочитаемостью и производительностью. Однако создание нового объекта занимает не так много времени.
Ответ №1:
Ответ отрицательный. Не существует реализованного механизма, который будет проверять статический анализ такого кода. Тогда компилятор Java не может изменить смысл кода. В случае, если вам требуется новый экземпляр, он должен его предоставить.