Il y a une circonstance où vous êtes requis de le déclarer final --sinon cela entraînera une erreur de compilation--, à savoir les faire passer dans des classes anonymes. Exemple de base :
public FileFilter createFileExtensionFilter(final String extension) {
FileFilter fileFilter = new FileFilter() {
public boolean accept(File pathname) {
return pathname.getName().endsWith(extension);
}
};
// What would happen when it's allowed to change extension here?
// extension = "foo";
return fileFilter;
}
Retirer le final
entraînerait une erreur de compilation, car il n'est plus garanti que la valeur soit une constante d'exécution. La modification de la valeur depuis l'extérieur de la classe anonyme entraînerait notamment un comportement différent de l'instance de la classe anonyme après le moment de sa création.
3 votes
@Joachim - en fait c'est la même chose que
const
en C ! La différence est qu'en Java, un "pointeur" vers un objet ne porte pas de nom particulier.*
syntaxe. D'où la confusion ici. La variable est const/final, l'objet vers lequel elle pointe ne l'est pas.0 votes
@Earwicker Je pense que je comprends votre point de vue, mais je pense que celui de Joachim est beaucoup plus précis en disant qu'un paramètre de méthode 'final' n'a aucune implication pour l'appelant, ce qui est vrai, mais pas vraiment ce que 'const' signifie en général.
0 votes
Par ailleurs, je pense que l'on voit souvent des méthodes déclarées de cette façon par des personnes qui pensent, à juste titre, qu'il est plus clair et moins sujet aux erreurs de ne pas traiter les paramètres des méthodes comme des variables locales qui peuvent changer. Le terme "final" ne fait qu'imposer cela.
0 votes
@Earwicker : Mon C est faible. Je pensais me souvenir qu'un
const
a forcé chaque valeur transmise à provenir d'un paramètreconst
également. Il semble que ce soit une erreur. Désolé.1 votes
@Sean : i je le vois souvent, parce que notre formateur eclipse est configuré pour le faire. c'est un artefact de tout un concept qui promeut le codage de la manière la plus restreinte (avec les modificateurs d'accès et en général), donc quand vous supprimez la restriction, vous devez le faire explicitement. mes deux centimes.
0 votes
@Joachim - La question est de savoir si la variable est autonome ou si elle est une référence/pointeur à quelque chose d'autre. Ceci est toujours explicite en C, mais dépend du type en Java. En C, vous décidez si une variable pointeur doit être const, ou l'objet vers lequel elle pointe, ou les deux. Vous pouvez mettre
const
à différents endroits pour obtenir la combinaison que vous voulez.const Obj *p
fait leObj
immuable mais qui vous permet de changerp
pour pointer vers un autreObj
alors queObj * const p
laisse leObj
mutable et verrouillep
. Enfin,const Obj * const p
rend le pointeur et l'objet immuables.0 votes
@DanielEarwicker : Je crois qu'il est plus correct de dire que
const
en C est similaire àfinal
en Java, mais la sémantique de ces deux mots-clés n'est pas identique d'un langage à l'autre.