4.13 | Geschachtelte Klassen |
SeitJava 1.1 ist es auch möglich, Klassen innerhalb von Klassen oder lokal in Methoden zu vereinbaren.
Geschachtelte Klassen bieten zum einen eine verbesserte Unterstützung des Kapselungsprinzips, da Hilfsklassen lokal vereinbart werden können und somit auch wirklich nur dort sichtbar sind, wo sie benötigt werden. Zum anderen bieten sie ein Äquivalent zu Methoden-Pointern in C oder den Blöcken in Smalltalk, mit denen sich Iteratoren oder Event-Handler einfach realisieren lassen. Geschachtelte Klassen eignen sich auch als »Ersatz« für die in anderen Programmiersprachen bekannten Aufzählungstypen.
Ohne geschachtelte Klassen wurden Hilfsklassen zum Teil als eigenständige Nicht-public-Klassen in der Quelltextdatei der Klasse deklariert, die sie benötigte. Hierdurch wurde die Hilfsklasse aber gleich für das gesamte Paket sichtbar, was nicht immer erwünscht ist. Ein häufiger Verwendungszweck von geschachtelten Klassen sind Adapter-Klassen, mit denen auf Oberflächenereignisse reagiert wird. Im Zusammenhang mit geschachtelten Klassen unterscheidet man zwei Arten von Klassen:Grundsätzlich gilt bei geschachtelten Klassen, dass die Hierarchie, die sich durch die Schachtelung von Klassen ergibt, völlig getrennt vom Vererbungsstammbaum betrachtet werden muss. Weiterhin darf eine geschachtelte Klasse nicht denselben Namen tragen wie eine ihrer umschließenden Klassen. Alle private-Bestandteile, die eine Klasse definiert, sind in allen geschachtelten Klassen verfügbar.
- Top-Level-Klassen
Die Top-Level-Klassen werden wiederum in zwei Gruppen unterteilt:
- Zum einen in die Bestandteile des Pakets (»package members«), also die public- und nicht-public-Klassen, die nicht innerhalb einer anderen Klasse vereinbart sind. Dies ist der Typ von Klasse, den man in Version 1.0 kannte und der in den vorangegangenen Abschnitten behandelt wurde.
- Zum anderen in die geschachtelten Top-Level-Klassen oder -Interfaces, die als static-Bestandteile einer anderen Klasse (oder eines Interface) vereinbart sind
- Innere Klassen
Von den inneren Klassen gibt es drei Arten:
- Die Elementklassen, die als Nicht-static-Bestandteile einer anderen Klasse vereinbart sind
- Die lokalen Klassen, die innerhalb einer Methode oder eines Blocks definiert sind
- Die anonymen Klassen, die ein Spezialfall der lokalen Klassen sind. Eine anonyme Klasse hat keinen Namen und wird dann benutzt, wenn ein kleines »Einmal«-Objekt in einem Ausdruck benötigt wird