Comment “final int i” travailler à l'intérieur d'une application Java pour la boucle?
J'ai été surpris de voir que le code Java suivant extrait de code compilé et exécuté:
for(final int i : listOfNumbers) {
System.out.println(i);
}
où listOfNumbers est un tableau d'entiers.
Je pensais que les déclarations finales ai attribué qu'une seule fois. Est le compilateur de la création d'un objet Integer et de changer ce qu'il référence?
Vous devez vous connecter pour publier un commentaire.
Imaginer que la sténographie ressemble beaucoup à cela:
Voir @TravisG pour une explication des règles de portée impliqués. La seule raison pourquoi vous devez utiliser un final variable de boucle, comme c'est si vous avez besoin de se refermer sur elle dans un anonyme intérieur de la classe.
La variable de boucle n'est pas dans le champ d'application de l'Exécutable, lorsqu'elle est exécutée, uniquement lorsqu'il est instancié.
Sans le
final
mot-clé de la variable de boucle ne serait pas visible à l'Exécutable, quand il finit par s'exécuter. Même s'il l'était, ce serait la même valeur pour tous les Runnables.Btw, sur 10 ans, vous pourriez avoir vu une très faible amélioration de la vitesse de l'aide de final sur une variable locale (dans quelques rares occasions); qui n'a pas été le cas pendant longtemps. Maintenant, la seule raison de l'utilisation finale est à vous autoriser à utiliser une fermeture lexicale comme ça.
En réponse à @mafutrct:
Lorsque vous écrivez du code, vous le faites pour les deux publics. La première est l'ordinateur qui, tant qu'il est syntaxiquement correct, va être heureux avec ce choix que vous faites. La deuxième est pour un futur lecteur (souvent même), ici le but est de communiquer le "intention" du code, sans occulter la "fonction" du code. Fonctionnalités de la langue doit être utilisée idiomatique avec quelques interprétations que possible afin de réduire les ambiguïtés.
Dans le cas de la variable de boucle, l'utilisation de final peut être utilisé pour communiquer, soit de deux choses l'une: seule la cession; ou, à la fermeture. Une simple analyse de la boucle est vous dire si la variable de boucle est réaffecté; toutefois, en raison de l'imbrication des deux chemins d'exécution lors de la création d'une clôture, il peut être facile d'oublier que la fermeture destiné à la capture de la variable. À moins, bien sûr, vous ne jamais utiliser final pour indiquer l'intention de capturer, au point où il devient évident pour le lecteur qu'est ce qui se passe.