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
?
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
?
Réponse Courte
Les arrêts de la "myTextField" variable d'être affecté à autre chose.
Réponse Longue
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.
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);
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.
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.
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 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.