Existe algum motivo de desempenho para declarar parâmetros de método finais em Java?
Como em:
public void foo(int bar) { ... }
Versus:
public void foo(final int bar) { ... }
Supondo que bar
seja apenas lido e nunca modificado em foo()
.
Existe algum motivo de desempenho para declarar parâmetros de método finais em Java?
Como em:
public void foo(int bar) { ... }
Versus:
public void foo(final int bar) { ... }
Supondo que bar
seja apenas lido e nunca modificado em foo()
.
Respostas:
A palavra-chave final não aparece no arquivo de classe para variáveis e parâmetros locais, portanto, não pode afetar o desempenho do tempo de execução. Seu uso é apenas para esclarecer a intenção do codificador de que a variável não seja alterada (o que muitos consideram uma razão duvidosa para seu uso) e lidar com classes internas anônimas.
Há muitos argumentos sobre se o modificador final no próprio método tem algum ganho de desempenho, uma vez que os métodos serão sequenciados pelo compilador de otimização no tempo de execução de qualquer maneira, independentemente do modificador. Nesse caso, ele também deve ser usado apenas para restringir a substituição do método.
O único benefício de um parâmetro final é que ele pode ser usado em classes anônimas aninhadas. Se um parâmetro nunca for alterado, o compilador já detectará isso como parte de sua operação normal, mesmo sem o modificador final. É muito raro que os bugs sejam causados por um parâmetro atribuído inesperadamente - se seus métodos são grandes o suficiente para precisar desse nível de engenharia, torne-os menores - os métodos que você chama não podem alterar seus parâmetros.
Compiladores que operam após o carregamento da classe, como compiladores JIT, podem tirar proveito dos métodos finais. Conseqüentemente, os métodos declarados finais podem ter algum benefício de desempenho.
http://www.javaperformancetuning.com/tips/final.shtml
Ah e outro bom recurso
Apenas mais um ponto acima disso, usando variáveis locais não finais declaradas dentro do método - a instância da classe interna pode sobreviver ao frame da pilha, então a variável local pode desaparecer enquanto o objeto interno ainda está vivo
Presumo que o compilador poderia remover todas as variáveis finais estáticas privadas que têm um tipo primitivo, como int, e embuti-las diretamente no código, assim como com uma macro C ++.
No entanto, não tenho ideia se isso é feito na prática, mas poderia ser feito para economizar memória.