studyklar
GdI 2 · Übungsblatt 5 · Aufgabe 2

Zeitdauer: zweiter Konstruktor und das Geheimnisprinzip

Eine Zeitdauer lässt sich als 734 Minuten oder als 12 Stunden und 14 Minuten angeben. Die Klasse Zeitdauer soll beides können. Danach bauen wir sie innen völlig um, ohne dass ein anderes Programm etwas merkt. Rechts steht die Klasse des aktuellen Teils, die Zeilen zum Schritt sind hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 2

a) In der Vorlesung wurde eine Klasse „Zeitdauer“ mit den Attributen stunden und minuten erstellt. Sie wurde als Rückgabetyp für eine statische Methode verwendet, die eine Gesamtzahl von Minuten in Stunden und Minuten umrechnet. Z. B. werden 123 Gesamtminuten in 2 Stunden und 3 Minuten umgerechnet.

Diese Klasse findet sich im Paket „dauer“.

Nun soll die Klasse „Zeitdauer“ selbst für die Umrechnung zwischen Gesamtminuten und Stunden+Minuten zuständig sein. Hierfür soll es neben dem Konstruktor mit den Parametern stunden und minuten einen zweiten Konstruktur geben, der die gesamtminuten als einzigen Parameter hat. Zudem soll es neben den vorhanden getter-Methoden für Stunden und Minuten eine getter-Methode geben, die die Gesamtminuten zurückgibt.

Testen Sie Ihre Klasse mit Hilfe der Klasse „MinutenInStunden“.

b) Nun soll eine zweite Klasse „ZeitdauerB“ implementiert werden, die sich nach außen hin exakt so verhält wie die Klasse „Zeitdauer“ (gleiche öffentliche Methoden, Konstruktoren mit den gleichen Parametern). Allerdings soll intern die Dauer nicht in Form der zwei Attribute stunden und minuten gespeichert werden, sondern in nur einem int-Attribut als Gesamtminuten. Entsprechend müssen manche Methoden und Konstruktoren angepasst werden.

Testen Sie, ob sich die neue Klasse tatsächlich genauso verhält wie die obige Klasse.

Sie haben mit der Lösung dieser Aufgabe die Anwendung des Geheimnisprinzips demonstriert: Da das Innere der Klasse privat und daher von außen nicht sichtbar ist, kann man die Implementierung verändern, ohne dass andere Klassen etwas davon merken oder mit geändert werden müssen.

In der Vorlesung hat eine Methode wandleMinutenInStunden in der Klasse MinutenInStunden umgerechnet. Sie gab das Ergebnis als Zeitdauer-Objekt zurück. Jetzt soll die Klasse Zeitdauer das Umrechnen selbst übernehmen.

Die Klasse Zeitdauer aus der Vorlesung liegt uns nicht als Datei vor. Rechts steht sie so, wie sie nach Folie 17 aussehen muss. Die Datei MinutenInStunden.java gibt es im Code zur Vorlesung, aber nur auskommentiert: Ihre main-Methode ruft wandleMinutenInStunden auf. Unsere Testklassen ersetzen diesen Aufruf durch den neuen Konstruktor.

Merke: Wer eine Klasse benutzt, sieht nur ihre public-Teile: Konstruktoren und Methoden. Wie sie innen speichert, ist ihr Geheimnis.
  1. a) Zeitdauer: zweiter Konstruktor und getter für die Gesamtminuten; testen.
  2. b) ZeitdauerB: dieselben öffentlichen Teile, innen nur ein Attribut; vergleichen.

Was die Klasse schon kann

public class Zeitdauer {     private int stunden = 0;    private int minuten = 0;     public Zeitdauer(int stunden, int minuten) {        this.stunden = stunden;        this.minuten = minuten;    }
    public int getStunden() {        return stunden;    }     public int getMinuten() {        return minuten;    }

Die Klasse hat zwei private-Attribute, stunden und minuten. Der Konstruktor bekommt beide Werte. Zwei getter geben sie zurück; ein getter ist eine Methode, die nur den Wert eines Attributs liefert.

Von außen kommt man an die Werte nur über die getter heran. Genau das nutzen wir in Teil b) aus.

Aus Vorlesung 5, Folie 12 („Probleme beim direkten Zugriff auf Attribute“): Attribute sind private; gelesen und geändert werden sie nur über Methoden, die getter und setter.

Ein zweiter Konstruktor für die Gesamtminuten

    public Zeitdauer(int minutenGesamt) {        this.stunden = minutenGesamt / 60;        this.minuten = minutenGesamt % 60;    }
ZeileRechnungErgebnis
12734 / 6012
13734 % 60 = 734 − 12 · 6014

Eine Klasse darf mehrere Konstruktoren haben, wenn sich ihre Parameter unterscheiden. Das heißt Überladen. Java wählt beim new den Konstruktor, dessen Parameter zu den übergebenen Werten passen: ein int → der neue, zwei int → der alte.

Der neue Konstruktor rechnet um. / teilt zwei ganze Zahlen und lässt den Rest weg. % liefert genau diesen Rest. Für 734 Minuten:

Aus Blatt 1, Aufgabe 3 („Minuten in Tage, Stunden und Minuten umrechnen“): Bei int ist 734 / 60 gleich 12 (12 · 60 = 720) und 734 % 60 gleich 14 (734 − 720).
Aus Vorlesung 5, Folie 7 („Mehrere Konstruktoren für eine Klasse“): Konstruktoren mit unterschiedlichen Parametern dürfen nebeneinander stehen.
Noch 7 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Zeitdauer.java

speichert Stunden und Minuten

Abbildung 1Zeitdauer.java

speichert Stunden und Minuten

public class Zeitdauer {     private int stunden = 0;    private int minuten = 0;     public Zeitdauer(int stunden, int minuten) {        this.stunden = stunden;        this.minuten = minuten;    }     public Zeitdauer(int minutenGesamt) {        this.stunden = minutenGesamt / 60;        this.minuten = minutenGesamt % 60;    }     public int getStunden() {        return stunden;    }     public int getMinuten() {        return minuten;    }     public int getMinutenGesamt() {        return stunden * 60 + minuten;    }}
LegendeDie ganze Klasse Zeitdauer.