J'ai pensé écrire une réponse mise à jour et approfondie ici.
final
Le mot-clé peut être utilisé à plusieurs endroits.
- Des classes
A final class
signifie qu'aucune autre classe ne peut étendre cette classe finale. Lorsque Java Run Time ( JRE ) sait qu'une référence d'objet est dans le type d'une classe finale (disons F), il sait que la valeur de cette référence ne peut être que dans le type 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.
Ainsi, lorsqu'il exécute une méthode de cet objet, cette méthode n'a pas besoin d'être résolue au moment de l'exécution à l'aide d'une table virtuelle . c'est-à-dire que le polymorphisme d'exécution ne peut pas être appliqué. Donc, le temps d'exécution ne dérange pas à ce sujet. Cela signifie qu'il économise du temps de traitement, ce qui améliorera les performances.
- les méthodes
Un final method
de n'importe quelle classe signifie que toute classe enfant étendant cette classe ne peut pas remplacer cette ou ces méthodes finales. Ainsi, le comportement à l'exécution dans ce scénario est également tout à fait identique au comportement précédent que j'ai mentionné pour les classes.
- champs, variables locales, paramètres de méthode
Si l'on a spécifié tout type de ci-dessus comme final
, cela signifie que la valeur est déjà finalisée, donc la valeur ne peut pas être modifiée .
Ex:
Pour les champs, paramètres locaux
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
Pour les paramètres de méthode
void someMethod(final String s){
s = someOtherString; //compile error
}
Cela signifie simplement que la valeur de la valeur de final
référence ne peut pas être modifiée. c'est-à-dire qu'une seule initialisation est autorisée. Dans ce scénario, au moment de l'exécution, étant donné que JRE sait que les valeurs ne peuvent pas être modifiées, il charge toutes ces valeurs finalisées (des références finales) dans le cache L1 . Parce qu'il n'a pas besoin de se recharger encore et encore depuis la mémoire principale . Sinon, il se charge dans le cache L2 et effectue de temps en temps un chargement à partir de la mémoire principale. C'est donc aussi une amélioration des performances.
Donc, dans les trois scénarios ci-dessus, lorsque nous n'avons pas spécifié le final
mot - clé aux endroits que nous pouvons utiliser, nous n'avons pas à nous inquiéter, les optimisations du compilateur le feront pour nous. Il y a aussi beaucoup d'autres choses que les optimisations du compilateur font pour nous. :)