Existe-t-il une raison de performance pour déclarer les paramètres de méthode définitifs en Java?
Un péché:
public void foo(int bar) { ... }
Contre:
public void foo(final int bar) { ... }
En supposant que ce bar
n'est que lu et jamais modifié dans foo()
.
Réponses:
Le mot-clé final n'apparaît pas dans le fichier de classe pour les variables et paramètres locaux, il ne peut donc pas affecter les performances d'exécution. Son seul usage est de clarifier l'intention des codeurs que la variable ne soit pas modifiée (ce que beaucoup considèrent comme une raison douteuse pour son utilisation) et de traiter des classes internes anonymes.
Il y a beaucoup d'arguments pour savoir si le modificateur final de la méthode elle-même a un gain de performance puisque les méthodes seront de toute façon incorporées par le compilateur d'optimisation au moment de l'exécution, quel que soit le modificateur. Dans ce cas, il ne doit également être utilisé que pour restreindre le remplacement de la méthode.
la source
Le seul avantage d'un paramètre final est qu'il peut être utilisé dans des classes imbriquées anonymes. Si un paramètre n'est jamais modifié, le compilateur le détectera déjà dans le cadre de son fonctionnement normal, même sans le modificateur final. Il est assez rare que les bogues soient causés par un paramètre assigné de manière inattendue - si vos méthodes sont suffisamment grandes pour nécessiter ce niveau d'ingénierie, réduisez-les - les méthodes que vous appelez ne peuvent pas modifier vos paramètres.
la source
Les compilateurs qui fonctionnent après le chargement de classe, tels que les compilateurs JIT, peuvent tirer parti des méthodes finales. Par conséquent, les méthodes déclarées définitives pourraient avoir des avantages en termes de performances.
http://www.javaperformancetuning.com/tips/final.shtml
Oh et une autre bonne ressource
http://mindprod.com/jgloss/final.html
la source
Juste un point de plus, au-dessus de l'utilisation de variables locales non finales déclarées dans la méthode - l'instance de classe interne peut survivre au cadre de la pile, de sorte que la variable locale peut disparaître tant que l'objet interne est toujours en vie
la source
Je suppose que le compilateur pourrait éventuellement supprimer toutes les variables finales statiques privées qui ont un type primitif, tel que int, et les incorporer directement dans le code, comme avec une macro C ++.
Cependant, je n'ai aucune idée si cela est fait dans la pratique, mais cela pourrait être fait afin d'économiser de la mémoire.
la source