In Java gibt es vier Arten von verschachtelten Klassen:
Static nested class hat keinen direkten Zugriff auf die nicht-statischen Mitglieder der äußeren Klasse. Sie wird als separate Klasse kompiliert, ihre Instanzen speichern keinen versteckten Verweis auf das umgebende Objekt.
Inner class (nicht-statisch) hat einen impliziten Verweis auf das äußere Objekt und kann auf dessen Felder zugreifen. Diese Klasse wird häufiger zur Implementierung von Zuhörern oder Iteratoren verwendet, die Zugriff auf die Daten des äußeren Objekts benötigen.
class Outer { static class Nested { // statisch void foo() {} } class Inner { // nicht-statisch void bar() { System.out.println(value); // Zugriff auf das Feld der äußeren Klasse } } int value = 42; }
Verwenden Sie die static nested class für utilitaristische oder Hilfskonstrukte, die konzeptionell mit der äußeren Klasse verbunden sind, jedoch keinen Zugriff auf deren Zustand erfordern. Verwenden Sie die inner class, wenn Sie direkten Zugriff auf nicht-statische Mitglieder der äußeren Klasse für eine engere Integration benötigen.
Frage: "Kann die static nested class direkt auf nicht-statische Felder der Instanz der äußeren Klasse zugreifen?"
Antwort: Nein, die static nested class kann nicht direkt auf nicht-statische Felder oder Methoden der Instanz der äußeren Klasse zugreifen, da sie keinen (und keinen gespeicherten) Verweis auf das äußere Klassenobjekt enthält.
Geschichte
In einer Bibliothek zur Speicherung von Daten im Cache wurde eine static nested class verwendet, in der Annahme, dass sie auf die Konfigurationseinstellungen der äußeren Klasse zugreifen könnte. Nach dem Versuch, darauf zuzugreifen, trat ein Kompilierungsfehler auf – die innere Klasse sah die nicht-statischen Felder nicht, und die Architektur musste geändert werden.
Geschichte
In der Benutzeroberfläche eines grafischen Programms wurde eine inner class anstelle einer static nested class für Konstanten verwendet, was zu einem unnötigen impliziten Verweis auf das äußere Objekt führte. Infolgedessen konnte der Garbage Collector den Speicher nicht korrekt bereinigen, was zu Speicherlecks führte.
Geschichte
Bei der Serialisierung einer Sammlung, die innere Klassen enthielt, trat ein Problem auf: die inner class hielt einen Verweis auf das Elternobjekt, und bei der Serialisierung wurde der gesamte Baum der Abhängigkeiten serialisiert, was den Prozess stark verlangsamt und die Größe des Ergebnisses erhöht hat. Nach der Umstellung auf die static nested class verschwand das Problem.