2012-04-01 1 views
4

Existe-t-il un moyen d'accéder à une classe externe anonyme? Une classe normale peut être accédée par ClassName.this. Cela ne fonctionne pas, car une classe anonyme n'a évidemment pas de nom. J'ai également essayé d'utiliser la classe/interface étendue (comme Runnable.this) mais cela ne semble pas fonctionner de cette façon.Accéder à la classe externe anonyme sans stocker dans la variable?

Je suis sûr que ce n'est peut-être pas le meilleur style de codage, je suis juste curieux de savoir si c'est possible sans stocker cela de l'extérieur dans une variable.

exemple, méfiez-outer.this:

public class A 
{ 
    public static void main(String[] args) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       new Thread(new Runnable() { 
        @Override 
        public void run() { 
         synchronized (outher.this) { 
          outher.this.notify(); 
         } 
        } 
       }).start(); 
       try { 
        synchronized (this) { 
         wait(); 
        } 
       } catch (final InterruptedException ex) {} 
      } 
     }).start(); 
    } 
} 

Répondre

2

Non, il n'y a pas moyen d'accéder à des classes anonymes où que vous soyez, à l'exception de l'intérieur d'eux (à savoir autrement que par référence this). Ou par une variable explicitement déclarée.

final Runnable r1 = new Runnable() {...}; 
Runnable r2 = new Runnable() { 
    public void run() { 
     synchronized(r1) {...} 
    } 
}; 
+0

pensez-vous qu'il fonctionnera avec synchronized (this.getClass(). GetEnclosingClass()) avec des classes anonymes? –

+0

@ Eric R. Je pense que cela ferait quelque chose de différent de ce que DiddiZ a publié (peut-être que ce que vous proposez est ce que DiddiZ veut vraiment). Supposons que la méthode 'main' était exécutée simultanément dans de nombreux threads différents. Dans le code de DiddiZ, ils seraient tous synchrones sur différents objets - donc pas de conflit. Dans votre code, ils seraient tous synchrones sur le même objet, donc il y aurait un conflit. Mais je soupçonne que votre code est ce que DiddiZ veut vraiment. – emory

+0

Ceci est synchronisé par classe, pas par instance. Si change synchronization surveille à synchronized (this.getClass(). GetEnclosingClass()) et synchronized (this.getClass()) (au lieu de synchronized (this)) cela fonctionnera. Mais si vous exécutez plusieurs threads sur les mêmes instances Runnable, cela sera comme une synchronisation statique, c'est-à-dire sur toutes les instances. –

1

Vous pouvez ajouter une méthode pour retourner ce milieu this. Ce serait dans la portée mais pas caché (est-ce le bon terme? Shadowed? J'oublie.). Remarque: bien que les classes internes anonymes n'aient pas de nom, elles sont toujours des types. L'ajout de membres est donc visible à l'expression immédiate (new X() { Y z; }.z) et à l'intérieur. Vous ne pouvez pas faire middleThis().middleThis().

+0

C'est une manière intelligente de contourner la restriction "sans stockage dans une variable". – emory

Questions connexes