Оптимизирован ли этот код компилятором

#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 не может изменить смысл кода. В случае, если вам требуется новый экземпляр, он должен его предоставить.