Nein, das können Sie nicht, und nein, der Compiler kann es nicht herausfinden. Aus diesem Grund schlägt FindBugs immer vor, anonyme innere Klassen in benannte staticverschachtelte Klassen zu ändern, wenn sie ihre implizite thisReferenz nicht verwenden .
Bearbeiten: Tom Hawtin - Tackline sagt, dass, wenn die anonyme Klasse in einem statischen Kontext (z. B. in der mainMethode) erstellt wird, die anonyme Klasse tatsächlich ist static. Aber die JLS ist anderer Meinung :
Eine anonyme Klasse ist niemals abstract(§8.1.1.1). Eine anonyme Klasse ist immer eine innere Klasse (§8.1.3); es ist niemals static(§8.1.1, §8.5.1). Eine anonyme Klasse ist immer implizit final(§8.1.1.2).
Das Java-Glossar von Roedy Green besagt, dass die Tatsache, dass anonyme Klassen in einem statischen Kontext zulässig sind, implementierungsabhängig ist:
Wenn Sie diejenigen verblüffen möchten, die Ihren Code verwalten, haben Wags festgestellt, javac.exedass anonyme Klassen innerhalb des staticInit-Codes und der staticMethoden zulässig sind, obwohl die Sprachspezifikation besagt, dass anonyme Klassen dies niemals tun static. Diese anonymen Klassen haben natürlich keinen Zugriff auf die Instanzfelder des Objekts. Ich empfehle dies nicht. Die Funktion kann jederzeit abgerufen werden.
Edit 2: Das JLS behandelt statische Kontexte in §15.9.2 expliziter :
Sei C die Klasse, die instanziiert wird, und sei i die Instanz, die erstellt wird. Wenn C eine innere Klasse ist, habe ich möglicherweise eine sofort einschließende Instanz. Die unmittelbar einschließende Instanz von i (§8.1.3) wird wie folgt bestimmt.
- Wenn C eine anonyme Klasse ist, dann:
- Wenn der Ausdruck zur Erstellung einer Klasseninstanz in einem statischen Kontext auftritt (§8.1.3), habe ich keine unmittelbar einschließende Instanz.
- Andernfalls wird die unmittelbar umgebende Instanz von i ist
this.
Eine anonyme Klasse in einem statischen Kontext entspricht also in etwa einer staticverschachtelten Klasse, da sie keinen Verweis auf die einschließende Klasse enthält, obwohl es sich technisch gesehen nicht um eine staticKlasse handelt.