web-dev-qa-db-fra.com

Pourquoi déclarer un argument de fonction final?

Je travaille actuellement mon chemin à travers le livre "Teach Yourself Android Application Development in 24 Hours" publié par Sams. Je suis relativement nouveau pour Java, Android = ou autre. J'ai une expérience très solide en ActionScript 3, qui a suffisamment de similitudes avec Java que le langage lui-même n'est pas difficile à saisir, mais j'ai encore quelques questions sur la justification derrière certains exemples de code du livre. Par exemple, voici une fonction fournie avec l'exemple de code pour Hour 9:

private void processScores(final TableLayout scoreTable, 
      XmlResourceParser scores) throws IOException, XmlPullParserException{

Dans cette signature de fonction, les auteurs ont déclaré l'argument scoreTable comme final. Je suis un peu perplexe quant à la raison pour laquelle ils ont fait cela. Cela ne me viendrait pas à l'esprit d'essayer même d'attribuer une nouvelle valeur à l'argument de fonction scoreTable (c'est considéré comme une mauvaise pratique dans ActionScript). De plus, je n'ai vu personne faire cela dans le monde réel Java que j'ai examiné ou porté dans AS3.

Y a-t-il quelque chose de spécifique à propos du développement Android qui oblige parfois à déclarer certains arguments de fonction comme finaux?

Pourquoi l'objet TableLayout est-il déclaré final, mais pas le XmlResourceParser?

56
scriptocalypse

Il y a deux raisons principales pour lesquelles vous souhaitez marquer un argument final. Tout d'abord, si vous prévoyez d'utiliser l'argument dans une classe interne anonyme, vous devez le marquer final afin qu'il puisse être référencé dans cette classe. Il s'agit en fait d'un cas d'utilisation assez courant pour marquer les arguments comme définitifs.

L'autre raison courante pour marquer les arguments final est de vous empêcher de les écraser accidentellement. Si vous ne voulez vraiment pas changer les arguments, alors peut-être que vous devriez les marquer final de sorte que si vous le faites réellement, vous obtiendrez l'erreur au moment de la compilation plutôt que découvrir lors de l'exécution que votre code a un bogue.

89
templatetypedef