Java Videotraining Werbung

Videotraining Spring 3 Boot 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 Evolution als geschachtelter Typ im Pokopetto (NEU) ⭐

Nach intensiver Forschung erkennt Captain CiaoCiao, dass die Evolution untrennbar mit einem Pokopetto verbunden ist — sie ist eine fundamentale Eigenschaft, die nur im Kontext eines Pokopettos Sinn ergibt. Entsprechend sollte der Evolutionstyp direkt in der Pokopetto-Klasse deklariert werden.

Aufgabe:

  • Die Evolution ist eine fundamentale Eigenschaft eines Pokopettos und sollte daher als geschachtelter Typ definiert werden.

  • Verschiebe den Aufzählungstyp Evolution in die Klasse Pokopetto.

  • Wie werden die Evolutionsstufen BABY/TEEN/ADULT qualifiziert?

Pokopetto Evolution UML
Abbildung 1. UML-Diagramm mit geschachteltem Typ

1.1.2 Drei Varianten des PokopettoEnergyComparator implementieren (NEU) ⭐

Captain CiaoCiao möchte seine Code-Basis optimieren und verschiedene Möglichkeiten erkunden, wie er den Vergleich der Pokopetto-Energie implementieren kann. Zur Erinnerung: Bisher ist der PokopettoEnergyComparator eine eigene Klasse und sieht so aus: so aus:

public class PokopettoEnergyComparator implements Comparator<Pokopetto> {
  @Override
  public int compare( Pokopetto p1, Pokopetto p2 ) {
    System.out.println( p1 + " vs " + p2 );
    return Integer.compare( p1.getMood(), p2.getMood() );
  }
}

Aufgabe:

  • Implementiere den PokopettoEnergyComparator auf drei verschiedene Arten:

    1. Als statische geschachtelte Klasse in Pokopetto.

    2. Als lokale Klasse in einer Methode von PokopettoDemo.

    3. Als anonyme innere Klasse:

1.2 Aufgaben aus 1. Auflage

1.2.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 2. UML-Diagramm mit geschachteltem Typ

1.2.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 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 als

    • statische geschachtelte Klasse,

    • lokale Klasse,

    • anonyme innere Klasse.