Auf Grundlage des Zeitmanagers ist es nunmehr möglich das Ausleihdatum einer Videokassette zu bestimmen. Dadurch ist man wiederum in der Lage eine Klasse zu definieren, die die Verleihkassette repräsentiert.
Zur Erinnerung: die Klasse AutmomatUser
kapselt einen StoringStock
, in welchem die entliehenen Videos des Kunden gespeichert werden sollen. Im Gegensatz zum CountingStock
sind die Bestandseinträge eines StoringStock
eigenständige Objekte mit individuellen Eigenschaften (z.B. die Ausleihzeit) und nicht nur Referenzen auf Katalogeinträge, versehen mit einer entsprechenden Anzahl. Einträge in einem solchen Bestand müssen das Interface StockItem
implementieren. Entsprechend bedarf es einer Klasse für die entliehenen Videos, die die Schnittstelle erfüllt. Die neue Klasse VideoCassette
erfüllt die Bedingungen. Es handelt sich um eine Ableitung von StockItemImpl
der frameworkinternen Implementation von StockItem
.
package videoautomat; public class VideoCassette extends StockItemImpl { private long rentTime; public VideoCassette(String key) { super(key); rentTime = ((Date) Shop.getTheShop().getTimer().getTime()).getTime(); } }
Dem Konstruktor der neuen Klasse muss der String-Identifier des zugehörigen Katalogeintrags übergeben werden. Der String wird über den super(String s)
-Aufruf an den Konstruktor der Oberklasse delegiert. Außerdem wird die aktuelle Zeit über den globalen Zeitmanager abgerufen und einer long
-Variable zugeordnet.
Hinweis: Damit die Typumwandlung (class cast) zu Date
funktioniert, muss java.util.Date
und nicht sale.Date
importiert werden.
Abschließend werden noch zwei Methoden implementiert, eine für die Rückgabe der Tage, die das Video bereits entliehen ist und eine zur Ermittlung der bis dato entstandenen Kosten.
package videoautomat; public class VideoCassette extends StockItemImpl { . . . public int getDays() { long l = ((Date) Shop.getTheShop().getTimer().getTime()).getTime() - rentTime; l /= 86400000; if(l==0) return 1; return (int) Math.ceil(l); } public NumberValue getCost() { return (NumberValue) MainClass.RENT_VALUE_DAY.multiply(getDays()); } }
Bei der Berechnung der Leihtage wird zunächst die Ausleihzeit vom aktuellen Zeitpunkt abgezogen und die resultierende Differenz wird durch die Millisekundenanzahl eines Tages dividiert. Ist das Ergebnis kleiner eins, wird eins zurückgegeben andernfalls der Quotient. Das erklärt sich aus der Forderung des Videoverleihs, wonach bei der Ermittlung der Verleihkosten je angefangene 24h die Kosten eines Tages abgerechnet werden müssen.
In der Methode der Kostenberechnung wird auf eine Konstante zurückgegriffen, die noch in der Klasse MainClass
definiert werden muss. Es handelt sich um die Leihkosten pro Tag.
public class MainClass { . . . public static NumberValue RENT_VALUE_DAY = new IntegerValue(200); }
Damit sind alle Vorraussetzungen erfüllt, um mit der Implementierung des Leihvorgangs zu beginnen.
Die Zeit | Der Ausleihprozess |