Comment puis-je obtenir la valeur de I Obtenir cette erreur: P> < BlockQuote>
ne peut pas faire référence à une variable non finale ID utilisateur à l'intérieur d'une classe interne définie dans une méthode différente p>
blockQuote> Je suis sûr que je ne peux pas l'affecter comme finale puisqu'il s'agit d'une variable avec une valeur inconnue. J'avais entendu dire que cette syntaxe préserve une portée d'une certaine manière, alors je pense qu'il doit y avoir une astuce de syntaxe, je ne sais pas encore pas encore. P> p> userid code> transmis à cette méthode dans ma sous-classe interne anonyme ici?
5 Réponses :
Bien sûr, vous pouvez l'affecter en finale - il suffit de mettre ce mot clé dans la déclaration du paramètre: Je ne suis pas sûr de ce que vous vouliez faire une variable avec une valeur inconnue ; Tous ces moyens finaux sont qu'une fois la valeur attribuée à la variable, elle ne peut pas être re em> -assigné. Puisque vous ne modifiez pas la valeur de l'ID utilisateur dans votre méthode, il n'y a aucun problème à le rendre final dans ce cas. P> p>
Ah ok. Je suppose que je n'ai pas vraiment compris comment fonctionne la déclaration code> finale de finale. Merci.
Quel est le problème de le faire final code> comme dans
Déclarez la méthode
public void doStuff(final String userID)
Comme tout le monde ici l'a dit, les variables locales doivent être définitives à accéder par une classe intérieure.
Voici (essentiellement) pourquoi c'est ... Si vous écrivez le code suivant (réponse longue, mais, En bas, vous pouvez obtenir la version courte: -): p> Le compilateur le traduit approximativement comme ceci: p> et enfin à ceci: p> L'important est l'endroit où il ajoute le constructeur à 1 $. Imaginez si vous pouviez le faire: P> class Main
{
private static interface Foo
{
void bar();
}
public static void main(String[] args)
{
int x;
Foo foo;
x = 42;
foo = new Foo()
{
public void bar()
{
System.out.println(x);
}
};
x = 1;
foo.bar();
}
}
Question: La classe Inner Annon ne fait que des copies automatiques de Final code> variables locales utilisées correctes? Pas de copies d'autres variables locales (finales ou non) qu'il n'utilise pas directement? Je demande parce que je suis préoccupé par les fuites de mémoire.
Dans Java 8, cela a changé un peu. Vous pouvez maintenant accéder aux variables qui sont effectivement finales em>. Snippet pertinent et exemple de Oracle Documentation (emphase mine): Cependant, à partir de Java SE 8, une classe locale peut accéder à la section locale
variables et paramètres du bloc ci-joint final ou
efficacement final em>. p>
BlockQuote> Final effectivement: strong> une variable ou un paramètre non final dont la valeur n'est jamais modifiée après son initialisation est effectivement finale for forte>. P> Par exemple, supposons que la variable
numberength code> n'est pas déclarée finale, et vous
Ajoutez l'énoncé d'affectation en surbrillance dans le
phonenumber code>
Constructeur: P>
public void printOriginalNumbers() {
System.out.println("Original numbers are " + phoneNumber1 +
" and " + phoneNumber2);
}
Dommage que Java nécessite final ici. Il est évident de compiler que la variable locale n'est pas modifiée, il ne faut pas demander à Coder de confirmer cela. Si la classe Anon écrit à la variable locale, un avertissement de compilation suffit. mauvais choix de conception.
Dupliqué possible de Pourquoi seulement les variables finales sont-elles accessibles dans la classe anonyme? < / a>