2009-03-23 7 views
3

Quand je passe une classe interne anonyme en fonction, je peux faire référence à des variables dans la portée actuelle à partir d'une méthode de cette classe, comme ceci:Y at-il un moyen pour que les classes internes anonymes de Java "perdent" leur portée?

class Caller { 
    private Object callerPrivate; 

    // ... 

    public void someMethod() { 
     final String callerLocal = "Eyes only"; 

     ISomeInterface anon = new ISomeInterface() { 
            public void doSomethingInterfacy { 
             System.out.println(callerPrivate.toString()); 
             System.out.println(callerLocal); 
            } 
            }; 
     // this is some other object that puts ISomeInterfaces in a queue 
     // and makes them doSomethingInterfacy later 
     myCallManager.enqueue(anon); 
    } 
} 

Maintenant, après someMethod a été exécuté ci-dessus, la L'appelant et la file d'attente avec les petits anons peuvent se séparer, et, autant que je sache, la JVM garde toutes les références droites pour que cela fonctionne toujours. Mais que se passe-t-il si, par exemple, la file d'attente est sérialisée, le programme est arrêté et redémarré, après quoi la file d'attente est désérialisée et les éléments sont exécutés, l'instance de l'appelant étant oubliée?

Y a-t-il d'autres moyens pour que l'objet environnant et la classe interne anonyme se séparent d'une manière telle que les appels à l'intérieur de la classe anon ne fonctionneront plus?

Répondre

6

Ne pas sérialiser les classes locales, car (a) les docs le disent et (b) la représentation en série n'est pas stable (ils n'ont pas de nom stable pour un démarrage).

Si vous ne souhaitez pas que votre instance conserve des champs pour cette variable externe et les locals finaux utilisés, utilisez une classe imbriquée (statique) ou une classe externe. Pour la sérialisation (Java), vous pouvez utiliser writeReplace pour sérialiser un objet proxy série.

2

N'oubliez pas que votre classe interne anonyme contient une référence implicite cette référence. c'est-à-dire une référence à la classe environnante. Donc si vous sériez votre classe intérieure, il y aura une référence à votre classe externe. Vous pouvez voir ceci clairement si vous sérialiser en utilisant XStream et voir la sortie XML.

Questions connexes