Question

Quelle est une variable finale en Java? Par exemple: si j'écris final int temp; en fonction quel est le sens du mot-clé finale
? Aussi, quand voudrais-je utiliser la variable finale (à la fois comme une variable de classe et comme une variable de fonction)?
Pourquoi variables dans un bloc synchronisé doit être déclarée finale?

Était-ce utile?

La solution

Fondamentalement, cela signifie que vous ne pouvez pas changer la valeur. Pour les variables d'instance, vous devez attribuer toutes les variables finales une fois (et une seule fois) dans le constructeur (ou avec un initialiseur variable). La synchronisation est un concept assez orthogonal.

La principale raison pour faire une locale variable final est donc vous pouvez l'utiliser dans une classe interne anonyme ... cela n'a rien à voir avec être dans un bloc synchronisé.

sont utiles pour les classes immuables, il est vrai - et immuabilité rend la vie plus facile dans un environnement multi-thread - mais c'est la seule relation entre les deux que je peux penser à ...

EDIT: Commentaire de Wildwezyr sens en termes de ne pas changer la variable sur lequel vous synchronisez . Ce serait dangereux, pour les raisons qu'il a donné. Est-ce que vous entendez par « variable dans le bloc synchronisé »?

Autres conseils

Variables finales et blocs de code synchronisés ont quelque chose en commun ... Si vous déclarez a variable non-finale, puis écrivez synchronized (a) { System.out.println('xxx'); } vous obtiendrez d'avertissement « Synchronisation sur le champ non-finale. » - au moins dans NetBeans

Pourquoi vous ne devriez pas la synchronisation sur le champ non-finale? Parce que si la valeur du champ peut être modifié, puis les différents fils peuvent être de synchronisation sur différents objets (différentes valeurs du champ) -. Il pourrait donc y avoir aucune synchronisation du tout (chaque fil peut pénétrer dans le bloc synchronisé en même temps)

Regardez ici par exemple de la difficulté de la vie réelle provoquée par la synchronisation sur le champ non-final: http://forums.sun.com/thread.jspa?threadID=5379204

En plus de ce que Jon Skeet dit, la valeur ne peut être modifiée, mais le contenu peut être modifié.

final Integer one = new Integer(1);
...
one = new Integer(2); // compile error

final List list = new ArrayList();
...
list = new ArrayList(); // compile error
list.add(1); // Changes list, but that's fine!

Il faut aussi savoir que finale et finale statique ne sont pas les mêmes. finale est dans le cadre de l'instance, alors que static final est le même pour toutes les instances d'une classe (dans d'autres langues ce qu'on pourrait appeler une constante).

Personnellement, je pense que l'avantage de finale, même lorsqu'ils ne sont pas absolument nécessaires pour faire fonctionner votre logiciel, est au sens sémantiquement. Il vous offre la possibilité de dire au compilateur et la prochaine personne qui travaille sur ce code que cette variable ne vise pas à être changé, et que d'essayer de changer cela pourrait entraîner un bogue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top