Я думаю, что ответ «нет, оптимизация не произойдет из-за отсутствия или наличия ключевого слова final
», по крайней мере на виртуальной машине HotSpot.Но оптимизация скорее всего произойдет из-за других факторов.
Как и во многих мифах о производительности Java, ошибочное мнение о том, что объявление классов или методов как конечных результатов для повышения производительности широко распространено, но редко исследуется.Аргумент гласит, что объявление метода или класса как конечного означает, что компилятор может активнее вызывать вызовы метода, потому что он знает, что во время выполнения это определенно версия метода, который будет вызываться.Но это просто неправда.Тот факт, что класс X скомпилирован с конечным классом Y, не означает, что одна и та же версия класса Y будет загружена во время выполнения.Таким образом, компилятор не может встроить такие вызовы кросс-класса безопасно, окончательно или нет.Только если метод является закрытым, компилятор может его встроить свободно, и в этом случае ключевое слово final будет избыточным.
С другой стороны, среда выполнения и JIT-компилятор имеют больше информации о том, какие классыфактически загружены и могут принимать гораздо лучшие решения по оптимизации, чем компилятор.Если среда выполнения знает, что не загружены классы, расширяющие Y, то она может безопасно встроить вызовы методов Y независимо от того, является ли Y окончательным (при условии, что она может аннулировать такой JIT-скомпилированный код, если подкласс Yпозже загружен).Таким образом, реальность такова, что, хотя final может быть полезной подсказкой для тупого оптимизатора времени выполнения, который не выполняет глобального анализа зависимостей, его использование на самом деле не позволяет выполнять очень много оптимизаций во время компиляции и не требуется интеллектуальнымJIT для выполнения оптимизаций во время выполнения.