Pensei em escrever uma resposta atualizada e aprofundada aqui.
final
A palavra-chave pode ser usada em vários lugares.
- Aulas
A final class
significa que nenhuma outra classe pode estender essa classe final. Quando o Java Run Time ( JRE ) sabe que uma referência a objeto está no tipo de uma classe final (digamos F), ele sabe que o valor dessa referência pode estar apenas no tipo F.
Ex:
F myF;
myF = new F(); //ok
myF = someOther; //someOther cannot be in type of a child class of F.
//because F cannot be extended.
Portanto, quando ele executa qualquer método desse objeto, esse método não precisa ser resolvido em tempo de execução usando uma tabela virtual . ou seja, o polimorfismo em tempo de execução não pode ser aplicado. Portanto, o tempo de execução não se preocupa com isso. O que significa que economiza tempo de processamento, o que melhora o desempenho.
- métodos
A final method
de qualquer classe significa que qualquer classe filha que estenda essa classe não poderá substituir o (s) método (s) final (is). Portanto, o comportamento em tempo de execução nesse cenário também é o mesmo com o comportamento anterior que mencionei para as classes.
- campos, variáveis locais, parâmetros de método
Se alguém especificou qualquer tipo acima final
, significa que o valor já está finalizado, portanto, o valor não pode ser alterado .
Ex:
Para campos, parâmetros locais
final FinalClass fc = someFC; //need to assign straight away. otherwise compile error.
final FinalClass fc; //compile error, need assignment (initialization inside a constructor Ok, constructor can be called only once)
final FinalClass fc = new FinalClass(); //ok
fc = someOtherFC; //compile error
fc.someMethod(); //no problem
someOtherFC.someMethod(); //no problem
Para parâmetros de método
void someMethod(final String s){
s = someOtherString; //compile error
}
Isso significa simplesmente que o valor do valor de final
referência não pode ser alterado. ou seja, apenas uma inicialização é permitida. Nesse cenário, em tempo de execução, como o JRE sabe que os valores não podem ser alterados, ele carrega todos esses valores finalizados (de referências finais) no cache L1 . Porque ele não precisa a carga de volta novamente e novamente de memória principal . Caso contrário, ele será carregado no cache L2 e será carregado periodicamente da memória principal. Portanto, é também uma melhoria de desempenho.
Portanto, em todos os três cenários acima, quando não especificamos a final
palavra - chave nos locais que podemos usar, não precisamos nos preocupar, as otimizações do compilador farão isso por nós. Também existem muitas outras coisas que as otimizações do compilador fazem por nós. :)