44 votes

Que fait "final" si vous le placez avant une variable?

Question très basique, mais que fait "final" si vous le placez avant une variable telle que celle ci-dessous ...

 final EditText myTextField = (EditText) findViewById(R.id.myTextField);
 

Que font final ?

72voto

Andrew Swan Points 5118

Réponse Courte

Les arrêts de la "myTextField" variable d'être affecté à autre chose.

Réponse Longue

  • Ne PAS arrêter le "myTextField" variable d'être muté, par exemple, ayant son champs de définir de nouvelles valeurs.
  • Rend le code plus lisible (à mon humble avis) car le lecteur n'a jamais à se demander si la "myTextField" variable seront repris plus tard dans le code.
  • Les gardes à l'encontre de la catégorie de bug où les variables sont accidentellement réaffectés (même raisonnement derrière décisions des instances immuable, que sur une plus petite échelle).

Pour les raisons indiquées ci-dessus, j'applique toujours la "finale" modificateur où que je peux pour les champs statiques, des champs d'instance, les variables locales et les paramètres de la méthode. Il n'gonfler un peu le code, mais pour moi, il vaut la lisibilité et la robustesse.

15voto

Michael Aaron Safyan Points 45071

Le mot-clé final, dans ce contexte, signifie que vous ne pouvez pas mettre à jour l'implicite pointeur myTextField pour pointer vers un objet différent (bien que vous pouvez modifier l'objet pointé par myTextField). Le mot-clé peut également être utilisé pour prévenir primordial (lorsqu'il est appliqué à des classes ou des méthodes).

L'une des raisons pour lesquelles vous pourriez le voir c'est que les classes anonymes qui font référence à des variables locales ne peuvent faire référence à des variables marquées final. C'est ainsi que l'anonyme classes ont besoin de stocker uniquement une double référence et n'ont pas besoin de maintenir la complète de l'accès à la pile de fonction. Par exemple:

Runnable r = new Runnable() { public static void run() {
         // do something with myTextField
         // this would require myTextField to have been marked final.
}};
doSomethingLater(r);

10voto

Stephen C Points 255558

Une chose qu'aucune des autres réponses ont noté, c'est qu'un final attribut a des propriétés particulières vis-a-vis de la Java du modèle de mémoire. L'effet net est que l'un thread peut accéder en toute sécurité à un final valeur de l'attribut sans prendre des mesures pour se synchroniser avec d'autres threads.

SUIVI

C'est que la JVM spécifique?

La spécification de Java modèle de mémoire est une partie de la Java Language Specification, et (autant que je sache) n'a pas changé depuis Java 1.5. En ce sens, ce n'est pas JVM spécifiques.

Cependant, le comportement de Java si vous ne suivez pas les règles (par exemple, si votre code n'est pas correctement synchroniser son utilisation de données partagée) dépend de toutes sortes de choses, y compris le matériel que vous exécutez l'application sur.

Entre autres choses, la Java de la mémoire de modèle est conçu pour permettre le multi-core machines pour exécuter plusieurs threads Java sans avoir à continuellement vider les caches de mémoire ... ce qui voudrait tuer la performance. Fondamentalement, il indique quelques règles qui garantissent qu'un fil de Java voit mémoire des mises à jour à partir d'un autre thread. Si une application ne respecte pas les règles, il est possible qu'un thread va voir un rassis (de la date) de la valeur dans un champ écrite par un autre thread, ce qui entraîne occasionnel comportement indéfini.

4voto

Suresh Kumar Points 3170

Le mot clé final garantit que myTextField contient la référence de ce que findViewByID () renvoie et interdit toute autre affectation à la variable myTextField , c’est-à-dire après l’exécution de la

 final EditText myTextField = (EditText) findViewById(R.id.myTextField);
 

Si vous essayez d'attribuer une valeur à myTextField, vous obtiendrez une erreur de compilation.

3voto

Ravi Gummadi Points 3146

Vous ne pouvez pas modifier la référence de l' myTextField une fois qu'il est attribué. Plus d'informations ci-dessous à partir de Wikipedia

Une dernière variable ne peut être attribué qu' une fois que. Cette affectation ne pas accorder la variable statut immuable. Si l' la variable est un champ d'une classe, il doit être attribué dans le constructeur de sa classe. (Note: Si la variable est un de référence, cela signifie que l' la variable ne peut pas être lié à référence à un autre objet. Mais l' objet auquel il fait référence est toujours mutable, si elle était à l'origine mutable.) À la différence de la valeur d'un constant, la valeur d'une finale la variable n'est pas nécessairement connue au moment de la compilation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X