2014-10-16 33 views
10

Ho il seguente problema. Due tipi anonimi nidificati. Voglio accedere a "questo" riferimento della classe anonima esterna all'interno della classe più interiore. Di solito se si ha una classe nidificata anonima in una classe esterna denominata (chiamiamola "classe Outer"), lui/lei digiterà all'interno della classe nidificata Outer.this.someMethod(). Come faccio a riferire la classe esterna se è anonima? Esempio di codice:Come accedere a "questo" riferimento di classe esterna anonimo in java

public interface Outer { 
    void outerMethod(); 
} 

public interface Inner { 
    void innerMethod(); 
} 
... 
public static void main(String[] args) { 
... 
new Outer() { 
    public void outerMethod() { 
     new Inner() { 
      public void innerMethod() { 
       Outer.this.hashCode(); // this does not work 
      } // innerMethod 
     }; // Inner 
    } // outerMethod 
}; // Outer 
... 
} // main 

L'errore che ottengo è

Nessuna istanza allegando del tipo esterno è accessibile in ambito

So che posso copiare il riferimento in questo modo:

final Outer outerThisCopy = this; 

prima di istanziare il Inner oggetto e quindi fare riferimento a questa variabile. Il vero obiettivo è che voglio confrontare i codici hash di outerThisCopy e l'oggetto a cui si accede all'interno dell'oggetto new Inner (vale a dire il Outer.this) per scopi di debug. Ho dei buoni argomenti per pensare che questi due oggetti siano diversi (nel mio caso). [Contesto: l'argomento è che chiamare un getter implementato nella classe "Outer" che non è ombreggiato nella classe "Inner" restituisce oggetti diversi]

Qualche idea come accedo al "questo" riferimento del tipo anonimo?

Grazie.

+1

È possibile fornire un metodo 'outerHashCode() {return hashCode(); } 'nella tua classe esterna anonima. Nella tua classe interiore, hai accesso a questo metodo; chiamalo Temo, un altro approccio non è possibile. – Seelenvirtuose

risposta

14

Non è possibile accedere a un'istanza di classe anonima direttamente dalla classe interna o un'altra classe anonima al suo interno, poiché la classe anonima non ha un nome. Tuttavia, è possibile ottenere un riferimento alla classe esterna tramite un metodo:

new Outer() 
{ 
    public Outer getOuter() 
    { 
     return this; 
    } 

    public void outerMethod() 
    { 
     new Inner() 
     { 
      public void innerMethod() 
      { 
       getOuter().hashCode(); 
      } 
     }; 
    } 
}; 
+1

Grazie mille. Questo ha funzionato bene. – egelev

+0

È grandioso. Ma come funziona? –