9
votes

Java: classe intérieure anonyme utilisant une variable locale

Comment puis-je obtenir la valeur de userid transmis à cette méthode dans ma sous-classe interne anonyme ici? XXX

I Obtenir cette erreur: < 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

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.


2 commentaires

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>


5 Réponses :


7
votes

Bien sûr, vous pouvez l'affecter en finale - il suffit de mettre ce mot clé dans la déclaration du paramètre: xxx

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 -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.


1 commentaires

Ah ok. Je suppose que je n'ai pas vraiment compris comment fonctionne la déclaration finale de finale. Merci.



1
votes

Quel est le problème de le faire final comme dans xxx


0 commentaires

1
votes

Déclarez la méthode

public void doStuff(final String userID)


0 commentaires

10
votes

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> xxx pré>

Le compilateur le traduit approximativement comme ceci: p> xxx pré> et ensuite ceci: p> xxx pré>

et enfin à ceci: p> xxx pré>

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();
    }
}


1 commentaires

Question: La classe Inner Annon ne fait que des copies automatiques de Final 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.



2
votes

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);
}


0 commentaires