... à partir de Java SE 8, une classe locale peut accéder aux variables locales et aux paramètres du bloc englobant qui sont finaux ou effectivement finaux. Une variable ou un paramètre dont la valeur n'est jamais modifiée après son initialisation est effectivement finale.
Par exemple, supposons que la variable numberLength
n'est pas déclaré final, et vous ajoutez l'instruction d'affectation marquée dans le fichier PhoneNumber
constructeur :
public class OutterClass {
int numberLength; // <== not *final*
class PhoneNumber {
PhoneNumber(String phoneNumber) {
numberLength = 7; // <== assignment to numberLength
String currentNumber = phoneNumber.replaceAll(
regularExpression, "");
if (currentNumber.length() == numberLength)
formattedPhoneNumber = currentNumber;
else
formattedPhoneNumber = null;
}
...
}
...
}
Grâce à cette instruction d'affectation, la variable numberLength n'est plus effectivement finale. En conséquence, le compilateur Java génère un message d'erreur similaire à "les variables locales référencées depuis une classe interne doivent être finales ou effectivement finales". où la classe interne PhoneNumber tente d'accéder à la variable numberLength :
http://codeinventions.blogspot.in/2014/07/difference-between-final-and.html
http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html
2 votes
Beaucoup de réponses, mais toutes se résument essentiellement à "aucune différence". Mais est-ce vraiment vrai ? Malheureusement, je n'arrive pas à trouver une spécification de langage pour Java 8.
3 votes
@AleksandrDubinsky docs.oracle.com/javase/specs
1 votes
@AleksandrDubinsky pas "vraiment" vrai. J'ai trouvé une exception à cette règle. Une variable locale initialisée avec une constante n'est pas une expression constante pour le compilateur. Vous ne pouvez pas utiliser une telle variable pour un cas dans un switch/case avant d'ajouter explicitement le mot-clé final. Par exemple : "int k = 1 ; switch(someInt) { case k : ...".