Mise en cache des références de méthodes dans Java 8
Java 8 a introduit les références de méthodes, qui fournissent une syntaxe concise pour référencer les méthodes et les constructeurs d'instance. Cependant, des inquiétudes subsistent quant à l'utilité de la mise en cache de ces références. Pour comprendre ce sujet, il est essentiel de faire la distinction entre la mise en cache des références de méthode pour les exécutions fréquentes du même site d'appel et leur mise en cache pour les utilisations multiples d'une référence de méthode par différents sites d'appel.
Mise en cache des références de méthode pour le même site d'appel
Considérez le code suivant où Foo.func() est appelé à plusieurs reprises via doSomethingWithAFunc() :
class Foo { Y func(X x) {...} void doSomethingWithAFunc(Function<X,Y> f){...} void hotFunction(){ doSomethingWithAFunc(this::func); } }
La mise en cache de this::func serait censée éliminer le création de nouvelles instances de classe anonymes à chaque fois que hotFunction() est exécuté. Cependant, la JVM optimise déjà ce scénario en réutilisant l'instance de site d'appel créée lors du premier appel du lambda. La mise en cache de la référence de méthode dans ce cas est superflue.
Mise en cache de référence de méthode pour différents sites d'appel
En revanche, considérons l'exemple suivant :
Runnable r1 = System::gc; Runnable r2 = System::gc;
Ici, deux sites d'appel différents produisent des références de méthode à la même méthode cible System.gc() dans java.lang.System. La JVM est autorisée à partager une seule instance lambda entre elles, mais l'implémentation actuelle dans Java 8 ne le fait pas. Cela est dû aux avantages incertains en termes de performances liés à la maintenance d'un cache d'instances lambda.
Bonnes pratiques
Compte tenu de ces considérations, il n'est généralement pas recommandé de mettre en cache les références de méthodes, à moins qu'il n'y ait sont des problèmes de performance spécifiques qui ont été identifiés grâce à la mesure. La mise en cache peut potentiellement modifier le comportement d'exécution du programme, et elle ne doit être envisagée que dans les cas suivants :
Lorsque le lambda est créé lors de l'initialisation du constructeur ou de la classe et :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!