Есть ли какая-либо причина производительности для объявления параметров метода финальными в Java? - PullRequest
117 голосов
/ 06 ноября 2008

Есть ли причина производительности для объявления параметров метода окончательными в Java?

Как в:

public void foo(int bar) { ... }

Versus:

public void foo(final int bar) { ... }

Предполагается, что bar только для чтения и никогда не изменяется в foo().

Ответы [ 5 ]

94 голосов
/ 06 ноября 2008

Последнее ключевое слово не отображается в файле класса для локальных переменных и параметров, поэтому оно не может влиять на производительность во время выполнения. Он используется только для разъяснения намерения кодировщиков, что переменная не должна быть изменена (что многие считают сомнительной причиной ее использования), и имеет дело с анонимными внутренними классами.

Существует множество аргументов в пользу того, имеет ли конечный модификатор самого метода какой-либо выигрыш в производительности, поскольку методы все равно будут встроены оптимизирующим компилятором во время выполнения, независимо от модификатора. В этом случае его также следует использовать только для ограничения переопределения метода.

14 голосов
/ 06 ноября 2008

Единственным преимуществом конечного параметра является то, что он может использоваться в анонимных вложенных классах. Если параметр никогда не изменяется, компилятор уже обнаружит это как часть своей нормальной работы даже без окончательного модификатора. Довольно редко ошибки вызваны неожиданным назначением параметра - если ваши методы достаточно велики, чтобы нуждаться в таком уровне разработки, уменьшите их - методы, которые вы вызываете, не могут изменить ваши параметры.

0 голосов
/ 01 мая 2015

Еще одно замечание: использование неконечных локальных переменных, объявленных в методе, - внутренний экземпляр класса может пережить кадр стека, поэтому локальная переменная может исчезнуть, пока внутренний объект еще жив

0 голосов
/ 18 мая 2012

Я предполагаю, что компилятор может удалить все частные статические конечные переменные, которые имеют примитивный тип, например int, и встроить их непосредственно в код, как в макросе C ++.

Тем не менее, я понятия не имею, если это делается на практике, но это может быть сделано для экономии памяти.

0 голосов
/ 06 ноября 2008

Компиляторы, которые работают после загрузки классов, такие как JIT-компиляторы, могут воспользоваться преимуществами финальных методов. Следовательно, методы, объявленные как final, могут иметь некоторое преимущество в производительности.

http://www.javaperformancetuning.com/tips/final.shtml

Ох и еще один хороший ресурс

http://mindprod.com/jgloss/final.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...