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 static
verschachtelte Klassen zu ändern, wenn sie ihre implizite this
Referenz nicht verwenden .
Bearbeiten: Tom Hawtin - Tackline sagt, dass, wenn die anonyme Klasse in einem statischen Kontext (z. B. in der main
Methode) 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.exe
dass anonyme Klassen innerhalb des static
Init-Codes und der static
Methoden 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 static
verschachtelten Klasse, da sie keinen Verweis auf die einschließende Klasse enthält, obwohl es sich technisch gesehen nicht um eine static
Klasse handelt.