Есть ли причина для повышения производительности объявлять параметры метода окончательными в Java?
Как в:
public void foo(int bar) { ... }
Против:
public void foo(final int bar) { ... }
Предполагая, что bar
это только читается и никогда не изменяется foo()
.
java
performance
final
койка
источник
источник
Ответы:
Ключевое слово final не отображается в файле класса для локальных переменных и параметров, поэтому оно не может повлиять на производительность во время выполнения. Он используется только для того, чтобы прояснить намерение кодеров не изменять переменную (что многие считают сомнительной причиной ее использования) и иметь дело с анонимными внутренними классами.
Существует много споров о том, имеет ли модификатор final в самом методе какой-либо прирост производительности, поскольку методы в любом случае будут встроены оптимизирующим компилятором во время выполнения, независимо от модификатора. В этом случае его также следует использовать только для ограничения переопределения метода.
источник
Единственное преимущество последнего параметра состоит в том, что его можно использовать во вложенных анонимных классах. Если параметр никогда не изменяется, компилятор уже определит это как часть своей нормальной работы даже без модификатора final. Довольно редко ошибки вызываются неожиданным назначением параметра - если ваши методы достаточно велики, чтобы требовать такого уровня разработки, уменьшите их - методы, которые вы вызываете, не могут изменить ваши параметры.
источник
Компиляторы, которые работают после загрузки класса, например JIT-компиляторы, могут использовать методы final. Следовательно, методы, объявленные как final, могут иметь некоторое преимущество в производительности.
http://www.javaperformancetuning.com/tips/final.shtml
О, и еще один хороший ресурс
http://mindprod.com/jgloss/final.html
источник
Еще одно замечание к вышесказанному: использование не конечных локальных переменных, объявленных в методе - экземпляр внутреннего класса может пережить фрейм стека, поэтому локальная переменная может исчезнуть, пока внутренний объект все еще жив.
источник
Я предполагаю, что компилятор может удалить все частные статические конечные переменные с примитивным типом, например int, и встроить их непосредственно в код, как в макросе C ++.
Однако я понятия не имею, делается ли это на практике, но это можно было бы сделать для экономии памяти.
источник