Existe-t-il une raison de performance pour déclarer les paramètres de méthode final en Java?

StackOverflow https://stackoverflow.com/questions/266806

  •  06-07-2019
  •  | 
  •  

Question

Existe-t-il une raison de performance pour déclarer les paramètres de méthode définitifs en Java?

Comme dans:

public void foo(int bar) { ... }

Versus:

public void foo(final int bar) { ... }

En supposant que la barre ne soit lue et jamais modifiée dans foo () .

Était-ce utile?

La solution

Le mot-clé final n'apparaissant 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 utilisation sert uniquement à clarifier l'intention des codeurs de ne pas modifier la variable (ce que beaucoup considèrent comme une raison douteuse de son utilisation), et à traiter avec les classes internes anonymes.

Il y a beaucoup d'arguments sur le fait que le modificateur final de la méthode elle-même présente un gain de performances puisque les méthodes seront de toute façon insérées par le compilateur optimiseur au moment de l'exécution, quel que soit le modificateur. Dans ce cas, il ne devrait également être utilisé que pour restreindre le remplacement de la méthode.

Autres conseils

Le dernier 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 des bogues soient attribués à l'attribution inattendue d'un paramètre. 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.

Les compilateurs qui fonctionnent après le chargement des classes, tels que les compilateurs JIT, peuvent tirer parti des méthodes finales. Par conséquent, les méthodes déclarées finales pourraient avoir un avantage en termes de performances.

http://www.javaperformancetuning.com/tips/final.shtml

Oh et une autre bonne ressource

http://mindprod.com/jgloss/final.html

Juste un autre point sur l'utilisation de variables locales non finales déclarées dans la méthode: l'instance de classe interne peut survivre au cadre de pile, de sorte que la variable locale peut disparaître tant que l'objet interne est toujours en vie.

Je suppose que le compilateur pourrait éventuellement supprimer toutes les variables finales statiques privées ayant un type primitif, tel que int, et les insérer 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 pour économiser de la mémoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top