I am currently working on an English translation. If you like to help to proofread please contact me: ullenboom ät g m a i l dot c o m.

Java Videotraining Werbung

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

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 Klasse Radio ein.

  • Wenn wir auf einem Radio setModulation(…​) aufrufen, wie werden AM/FM qualifiziert und übergeben?

Radio Modulation UML
Abbildung 1. UML-Diagramm mit geschachteltem Typ

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:

Listing 1. com/tutego/exercise/device/bhdavq/ElectronicDeviceWattComparator.java
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 Double.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 als

    • statische geschachtelte Klasse,

    • lokale Klasse,

    • anonyme innere Klasse.