Pensé en escribir una respuesta actualizada y en profundidad aquí.
final
La palabra clave se puede utilizar en varios lugares.
- clases
A final class
significa que ninguna otra clase puede extender esa clase final. Cuando Java Run Time ( JRE ) sabe que una referencia de objeto está en el tipo de una clase final (digamos F), sabe que el valor de esa referencia solo puede estar en el tipo de 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.
Entonces, cuando ejecuta cualquier método de ese objeto, ese método no necesita ser resuelto en tiempo de ejecución usando una tabla virtual . es decir, el polimorfismo en tiempo de ejecución no se puede aplicar. Entonces el tiempo de ejecución no se preocupa por eso. Lo que significa que ahorra tiempo de procesamiento, lo que mejorará el rendimiento.
- métodos
A final method
de cualquier clase significa que cualquier clase secundaria que extienda esa clase no puede anular ese método o métodos finales. Por lo tanto, el comportamiento del tiempo de ejecución en este escenario también es bastante similar al comportamiento anterior que mencioné para las clases.
- campos, variables locales, parámetros del método
Si se especificó algún tipo de arriba como final
, significa que el valor ya está finalizado, por lo que el valor no se puede cambiar .
Ex:
Para campos, parámetros locales
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 del método
void someMethod(final String s){
s = someOtherString; //compile error
}
Esto simplemente significa que el valor del valor de final
referencia no se puede cambiar. es decir, solo se permite una inicialización. En este escenario, en tiempo de ejecución, dado que JRE sabe que los valores no se pueden cambiar, carga todos estos valores finalizados (de referencias finales) en la caché L1 . Debido a que no es necesario para cargar la espalda y otra vez de la memoria principal . De lo contrario, se carga en el caché L2 y se carga de vez en cuando desde la memoria principal. Por lo tanto, también es una mejora del rendimiento.
Entonces, en los 3 escenarios anteriores, cuando no hemos especificado la final
palabra clave en lugares que podemos usar, no debemos preocuparnos, las optimizaciones del compilador lo harán por nosotros. También hay muchas otras cosas que las optimizaciones del compilador hacen por nosotros. :)