1. Geschachtelte Typen
Alle bisherigen Typdeklaration standen in eigenen Dateien, sogenannten Compilationseinheiten. Java bietet allerdings mit geschachtelten Typen die Möglichkeit, in eine Typdeklaration eine andere Typdeklaration hinein zu setzen, um damit diese Typen noch enger aneinander zu binden. Die folgenden Übungen sollen deutlich machen, wofür sich geschachtelte Typen sehr gut eignen. Allerdings haben geschachtelte Typen einige Fallstricke, und deswegen sollen mehrere Quizfragen helfen, tieferes Verständnis für die geschachtelten Typen zu erlangen.
Voraussetzungen
statische geschachtelte Typen kennen
innere Typen (nicht-statische geschachtelte Typen) kennen
lokale (innere) Typen kennen
anonyme innere Klasse kennen
Noch mehr Aufgaben findest du im Buch: ›Captain CiaoCiao erobert Java: Das Trainingsbuch für besseres Java. 300 Java-Workshops, Aufgaben und Übungen mit kommentierten Lösungen‹
1.1. Geschachtelte Typen deklarieren
Geschachtelte Typen sind immer dann sinnvoll, wenn der innere Typ eine enge Bindung zum äußeren Typ hat oder wenn eine Typdeklaration »geheim« gehalten werden soll, da sie für andere Typen oder sogar andere Methoden nicht sichtbar sein soll. Die nächsten beiden Aufgaben zeigen Beispiele für genau diese beiden Gründe.
1.1.1. AM-FM-Modulation in den Radio-Typ setzen ⭐
In der Aufgabe »Radio eine AM-FM-Modulation geben« aus vorangehenden Kapitel »Eigene Klassen schreiben« haben wir den Aufzählungstyp Modulation
deklariert, und zwar in einer eigenen Java-Datei. Die Deklaration sah so aus:
public enum Modulation { AM, FM }
Die Schallwellen mit den Tönen werden moduliert, und es entstehen Radiowellen, die das Radio empfängt und wieder in Schallwellen übersetzt. Da ein Radio immer eine Modulation benötigt, lässt sich der Typ Modulation
in den Typ Radio
setzen und somit diese enge Bindung gut mit geschachtelten Typen abbilden. Damit lässt sich zum Beispiel die Modulation von Schallwellen eines Radios gut von der Modulation eines Videosignals trennen; so eine zweite Aufzählung ließe sich in einer Klasse TV
unterbringen.
Aufgabe:
Setze den Aufzählungstyp
Modulation
in die KlasseRadio
ein.Wenn wir auf einem Radio
setModulation(…)
aufrufen, wie werden AM/FM qualifiziert und übergeben?
1.1.2. Drei Arten von Watt-Comparator-Implementierungen schreiben ⭐
Im vorangehenden Kapitel, »Eigene Klassen schreiben«, haben wir in der Aufgabe »Verbrauch von Elektrogeräten vergleichen« die Schnittstelle Comparator
implementiert . Zur Erinnerung:
import java.util.Comparator;
public class ElectronicDeviceWattComparator
implements Comparator<ElectronicDevice> {
@Override
public int compare( ElectronicDevice ea1,
ElectronicDevice ea2 ) {
System.out.println( ea1 + " is compared with " + ea2 );
return Integer.compare( ea1.getWatt(), ea2.getWatt() );
}
}
Die Implementierung der Schnittstelle ist in einer eigenen Compilationseinheit, also Datei, doch die Schnittstelle lässt sich auch lokaler mithilfe von geschachtelten Typen implementieren.
Aufgabe:
Schreibe den
ElectronicDeviceWattComparator
je einmal alsstatische geschachtelte Klasse,
lokale Klasse,
anonyme innere Klasse.