Die Klasse Termin
Lösung geprüft
Die Aufgabe der heutigen Stunde ist die Klasse Termin! Wir entwerfen
sie erstmal auf dem Papier – welche Attribute, welche Methoden. Neu
dabei ist das enum, mit dem man eine feste Auswahl an
Werten festlegt. Genau so ein Auswahlfeld haben wir auf dem Screenshot
ja gesehen.
Eine Klasse Termin wird benötigt.
a) Beschreiben Sie die Klasse Termin
anhand des Screenshots der App.
b) Bestimmen Sie, welche Attribute und Methoden die
Klasse Termin braucht. Sie können dafür eine Notation in
Stichpunkten verwenden. Tipp: Es sollen die Klasse
LocalDate und die Klasse LocalTime verwendet
werden, beide benötigen eine Import-Anweisung. Beschreiben Sie
zunächst, welche Zwecke (bzw. Typ) ein Termin haben könnte,
beschränken Sie sich auf maximal 4.
a) Die Klasse Termin anhand des Screenshots
Im Block TERMINE steht ein Feld Datum und daneben ein Auswahlfeld, in dem GEBU…TAG steht – also „Geburtstag", abgeschnitten. Daraus liest man zwei Sachen: ein Termin hat ein Datum, und er hat eine Art, die man aus einer Liste auswählt.
Eine Uhrzeit ist im Screenshot nicht zu sehen. Sinnvoll ist sie trotzdem: ein Geburtstag braucht keine, ein geschäftliches Treffen schon. Deshalb nehmen wir sie dazu, sie darf aber leer bleiben.
b) Attribute, Methoden und der Zweck
Die vier Arten von Terminen
Die Aufgabe sagt ausdrücklich: höchstens vier. Meine Wahl:
| Art | Wofür |
|---|---|
GEBURTSTAG | Jährlich wiederkehrend, ohne Uhrzeit |
JAHRESTAG | Hochzeitstag und Ähnliches, ebenfalls jährlich |
GESCHAEFTLICH | Termin mit Uhrzeit, beruflich |
PRIVAT | Termin mit Uhrzeit, privat |
Attribute und Methoden in Stichpunkten
datum: LocalDate– der Tag des Terminsuhrzeit: LocalTime– die Uhrzeit, darfnullseinart: Art– eine der vier Konstanten von oben- Zwei Konstruktoren: einer mit und einer ohne Uhrzeit
- Getter und Setter für alle drei Attribute
toString(): String– damit man den Termin ausgeben kann
Das ist genau die Klasse, die im nächsten Schritt im UML-Editor gebaut wird:
Termin
------------------------------------------------
- datum: LocalDate
- uhrzeit: LocalTime
- art: Art
------------------------------------------------
c Termin(datum: LocalDate, art: Art)
c Termin(datum: LocalDate, uhrzeit: LocalTime, art: Art)
+ getDatum(): LocalDate
+ setDatum(datum: LocalDate)
+ getUhrzeit(): LocalTime
+ setUhrzeit(uhrzeit: LocalTime)
+ getArt(): Art
+ setArt(art: Art)
+ toString(): String
Die Zeichen davor sind die Sichtbarkeit: - ist
private, + ist public,
c markiert im Java-Editor einen Konstruktor. Die Attribute
sind alle privat, die Methoden alle öffentlich – das ist das Prinzip der
minimalen Sichtbarkeit: jede Klasse bekommt nur so viel Zugriff, wie sie
wirklich braucht.
Warum zwei Konstruktoren
Konstruktor-Überladung, schon wieder. Ein Geburtstag hat keine Uhrzeit, ein Geschäftstermin schon. Statt bei Geburtstagen irgendeine Dummy-Uhrzeit hinzuschreiben, gibt es einfach einen Konstruktor ohne:
new Termin(LocalDate.of(2025, 12, 24), Art.GEBURTSTAG);
new Termin(LocalDate.of(2025, 9, 1), LocalTime.of(14, 30), Art.GESCHAEFTLICH);
Was ein enum ist und warum man es nimmt
Ein enum (kurz für Enumeration, also Aufzählung) legt eine
endliche, feste Menge benannter Konstanten fest. Für
unsere vier Terminarten sieht das so aus:
public enum Art {
GEBURTSTAG, JAHRESTAG, GESCHAEFTLICH, PRIVAT
}
Man könnte die Art stattdessen als String speichern. Der
Vergleich zeigt, warum man das nicht tut:
| Mit String | Mit enum | |
|---|---|---|
| Tippfehler | "Gebrutstag" kompiliert klaglos | Art.GEBRUTSTAG → Fehler beim Kompilieren |
| Schreibweise | „privat", „Privat", „PRIVAT" – alles verschieden | Es gibt nur eine Schreibweise |
| Autovervollständigung | Der Editor kann nichts vorschlagen | Nach Art. kommt die Liste |
| Erlaubte Werte | Jeder beliebige Text geht rein | Nur die vier festgelegten |
Der wichtigste Punkt ist die erste Zeile: Fehler werden schon beim Kompilieren gefunden statt erst im laufenden Programm. Ein Tippfehler in einem String fällt dir erst auf, wenn ein Geburtstag plötzlich nicht mehr in der Geburtstagsliste auftaucht – und dann suchst du lange.
Zugegriffen wird über den Klassennamen davor, also
Termin.Art.GESCHAEFTLICH, wenn das enum innerhalb von
Termin steht. Praktisch sind enums außerdem mit
switch:
switch (art) {
case GEBURTSTAG: return "Geburtstag ohne Uhrzeit";
case JAHRESTAG: return "Jahrestag";
case GESCHAEFTLICH: return "Geschäftlich";
case PRIVAT: return "Privat";
}
Beim switch über ein enum schreibt man die Konstanten ohne
den Typ davor, also case GEBURTSTAG: und nicht
case Art.GEBURTSTAG:. Java weiß ja schon, um welches enum
es geht.
LocalDate und LocalTime statt String
Dasselbe Argument nochmal, nur für das Datum. Man könnte
"24.12.2025" als String speichern. Dann kann man aber nicht
sortieren, nicht vergleichen und nicht ausrechnen, wie viele Tage bis
dahin sind. Mit LocalDate geht das alles:
import java.time.LocalDate;
import java.time.LocalTime;
LocalDate weihnachten = LocalDate.of(2025, 12, 24);
LocalTime treffen = LocalTime.of(14, 30);
weihnachten.isAfter(LocalDate.now()); // liegt das noch vor uns?
Beide brauchen eine Import-Anweisung, sonst findet der Compiler sie
nicht. Sie stehen über der Klasse, genau wie bei der
ArrayList.