Als Aufgabe gilt es eine abstrakte Klasse Fahrzeug zu erstellen, von der dann jeweils die Klasse LKW und PKW erben.
Dann müssen wir ein Interface FahrzeugDAO mit einigen Methoden machen, welche wiederum in der Klasse SerializedFahrzeugDAO beschrieben werden.
z.B
loescheFahrzeug(Fahrzeug f);
aktualisiereFahrzeug(Fahrzeug f);
...
Was ich hierbei nicht verstehe: In der Klasse SerializedFahrzeugDAO müsste ich doch Objekte der Klasse Fahrzeug erzeugen, was aber wiederum nicht geht, da diese Klasse doch abstract ist, oder?
Hier noch die gesamte Aufgabenstellung um Unklarheiten auszuschließen.
// Aufgabenstellung:
Einzelaufgabe "Fahrzeugverwaltung"
1. Abstrakte Klasse Fahrzeug
Implementieren Sie eine abstrakte Klasse Fahrzeug. Diese Klasse dient zum Speichern von Informationen über Fahrzeuge.
Dabei sollen folgende Daten als private Instanzvariablen erfasst und dafür öffentliche Zugriffsmethoden (set… und get…) erstellt werden:
Marke
Modell
Baujahr
Leistung (PS)
Kilometerstand
Grundpreis (Euro)
Id (Fahrzeugnummer)
Überprüfungsdatum (Datum der letzten Überprüfung)
Überprüfungsintervall (in Jahren)
Wählen Sie passende Datentypen.
Es soll ein Konstruktor implementiert werden, der es ermöglicht, die entsprechenden Instanzvariablen direkt zu setzen.
Prüfen Sie beim Eintragen von Daten, ob es sich um zulässige Werte handelt (Ausnahmen: Marke und Modell). Beachten Sie z. B., dass Baujahr und Überprüfungsdatum nicht in der Zukunft liegen sollen.
Sollten Bedingungen nicht erfüllt sein, werfen Sie jeweils eine IllegalArgumentException mit einem sinnvollen Fehlertext.
Eine Methode getAlter() soll das Alter des Fahrzeuges berechnen. Eine Methode getNaechstePruefung() soll das Datum der nächsten Überprüfung berechnen (Anhand von Überprüfungsdatum und Überprüfungsintervall).
Zusätzlich soll es eine Methode getPreis() geben, die den Preis eines Fahrzeuges auf der Basis Grundpreis minus Rabatt berechnet. Zu diesem Zweck soll eine abstrakte Methode getRabatt() zur Klasse Fahrzeug hinzugefügt und innerhalb von getPreis() verwendet werden.
2. Klassen PKW und LKW
Es sollen zwei konkrete (nicht-abstrakte) Unterklassen PKW und LKW von der abstrakten Klasse Fahrzeug abgeleitet werden. Die Klasse PKW hat eine zusätzliche Instanzvariable für Ausstattungspakete sowie entsprechende Zugriffsmethoden. Die Namen (String) der Ausstattungspakete sollen in einer Liste gespeichert werden.
Beide Klassen sollen die Methode getRabatt() implementieren: für einen LKW erhält man einen Rabatt, der vom Fahrzeugalter abhängt (pro Jahr einen Rabatt von 5%), während man für einen PKW einen Rabatt abhhänging vom Fahrzeugalter und von zusätzlichen Ausstattungspaketen bekommt (pro Jahr einen Grundrabatt von 10% minus 1% pro Ausstattungspaket, bis zu einem Maximum von 5 Ausstattungspaketen). Der maximal mögliche Rabatt beträgt für PKW 95% und für LKW 90% des Grundpreises.
Eine Methode toString() soll alle Fahrzeugdaten als String zurückzugeben.
Platzieren Sie die Klassen Fahrzeug, LKW und PKW in einem Package swe2014.fm.fahrzeuge .
3. Interface FahrzeugDAO
Dieses Interface definiert Methoden des Entwurfsmusters Data Access Object (DAO, engl. für Datenzugriffsobjekt) zur Erstellung persistenter Fahrzeugobjekte. Dieses Muster ermöglicht es, auf Daten unabhängig von der Art der benutzten Datenquelle zuzugreifen («weitere Information und ein konkretes Beispiel»).
Das Interface FahrzeugDAO soll folgende generische Methoden zum Einlesen und Speichern von Fahrzeugobjekten deklarieren.
Die Methode getFahrzeugList() soll eine Liste (z. B. java.util.ArrayList) benutzen, um alle persistent gespeicherten Fahrzeugobjekte zurückzugeben.
Die Methode getFahrzeugbyId(… id) soll, anhand der Fahrzeugnummer, ein Fahrzeug-Objekt zurückgeben. Falls das Fahrzeug nicht gefunden wird, soll die Methode null zurückgeben.
Die Methode speichereFahrzeug(Fahrzeug …) soll ein Fahrzeugobjekt persistent speichern. Stellen Sie sicher, dass beim Speichern eines neuen Fahrzeuges nicht die Fahrzeugnummer eines bereits gespeicherten Fahrzeug verwendet wird. Werfen Sie in diesem Fall eine IllegalArgumentException mit einer entsprechenden Fehlermeldung.
Die Methode loescheFahrzeug(Fahrzeug …) soll ein bestehendes Fahrzeug von der persistenten Datenquelle löschen. Falls es kein solches Fahrzeug gibt, soll IllegalArgumentException (mit entsprechender Fehlermeldung) geworfen werden.
Die Methode aktualisiereFahrzeug(Fahrzeug …) soll die Daten eines bestehenden Fahrzeug ändern. Dabei soll sie das Fahrzeug-Objekt suchen, in dem die Fahrzeugnummer den selben Wert besitzt wie im übergebenen Fahrzeug-Objekt. Auch diese Methode soll IllegalArgumentException werfen, falls das Fahrzeug nicht existiert.
4. Klasse SerializedFahrzeugDAO
Die Klasse SerializedFahrzeugDAO implementiert das Interface FahrzeugDAO.
Benutzen Sie zur persistenten Speicherung in SerializedFahrzeugDAO die Java-Standardserialisierung.
Der Klasse soll im Konstruktor ein String übergeben werden, der den Dateinamen bzw. Pfad der Datenquelle(n) enthält.
Achten Sie darauf, dass in Methoden, die in eine Datei schreiben, alle Instanzvariablen der Fahrzeugobjekte gesetzt bzw. nicht leer sind. Falls ein Wert fehlt, soll eine entsprechende IllegalArgumentException geworfen werden. Alle weiteren (nicht applikationsspezifischen) Systemfehler, z. B. Fehler aus Dateioperationen, sollen abgefangen und auf der Systemkonsole protokolliert werden (sie müssen nicht weitergeleitet werden).
Platzieren Sie das Interface FahrzeugDAO sowie die Klasse SerializedFahrzeugDAO in einem Package swe2014.fm.fahrzeuge.dao .
Dann müssen wir ein Interface FahrzeugDAO mit einigen Methoden machen, welche wiederum in der Klasse SerializedFahrzeugDAO beschrieben werden.
z.B
loescheFahrzeug(Fahrzeug f);
aktualisiereFahrzeug(Fahrzeug f);
...
Was ich hierbei nicht verstehe: In der Klasse SerializedFahrzeugDAO müsste ich doch Objekte der Klasse Fahrzeug erzeugen, was aber wiederum nicht geht, da diese Klasse doch abstract ist, oder?
Hier noch die gesamte Aufgabenstellung um Unklarheiten auszuschließen.
// Aufgabenstellung:
Einzelaufgabe "Fahrzeugverwaltung"
1. Abstrakte Klasse Fahrzeug
Implementieren Sie eine abstrakte Klasse Fahrzeug. Diese Klasse dient zum Speichern von Informationen über Fahrzeuge.
Dabei sollen folgende Daten als private Instanzvariablen erfasst und dafür öffentliche Zugriffsmethoden (set… und get…) erstellt werden:
Marke
Modell
Baujahr
Leistung (PS)
Kilometerstand
Grundpreis (Euro)
Id (Fahrzeugnummer)
Überprüfungsdatum (Datum der letzten Überprüfung)
Überprüfungsintervall (in Jahren)
Wählen Sie passende Datentypen.
Es soll ein Konstruktor implementiert werden, der es ermöglicht, die entsprechenden Instanzvariablen direkt zu setzen.
Prüfen Sie beim Eintragen von Daten, ob es sich um zulässige Werte handelt (Ausnahmen: Marke und Modell). Beachten Sie z. B., dass Baujahr und Überprüfungsdatum nicht in der Zukunft liegen sollen.
Sollten Bedingungen nicht erfüllt sein, werfen Sie jeweils eine IllegalArgumentException mit einem sinnvollen Fehlertext.
Eine Methode getAlter() soll das Alter des Fahrzeuges berechnen. Eine Methode getNaechstePruefung() soll das Datum der nächsten Überprüfung berechnen (Anhand von Überprüfungsdatum und Überprüfungsintervall).
Zusätzlich soll es eine Methode getPreis() geben, die den Preis eines Fahrzeuges auf der Basis Grundpreis minus Rabatt berechnet. Zu diesem Zweck soll eine abstrakte Methode getRabatt() zur Klasse Fahrzeug hinzugefügt und innerhalb von getPreis() verwendet werden.
2. Klassen PKW und LKW
Es sollen zwei konkrete (nicht-abstrakte) Unterklassen PKW und LKW von der abstrakten Klasse Fahrzeug abgeleitet werden. Die Klasse PKW hat eine zusätzliche Instanzvariable für Ausstattungspakete sowie entsprechende Zugriffsmethoden. Die Namen (String) der Ausstattungspakete sollen in einer Liste gespeichert werden.
Beide Klassen sollen die Methode getRabatt() implementieren: für einen LKW erhält man einen Rabatt, der vom Fahrzeugalter abhängt (pro Jahr einen Rabatt von 5%), während man für einen PKW einen Rabatt abhhänging vom Fahrzeugalter und von zusätzlichen Ausstattungspaketen bekommt (pro Jahr einen Grundrabatt von 10% minus 1% pro Ausstattungspaket, bis zu einem Maximum von 5 Ausstattungspaketen). Der maximal mögliche Rabatt beträgt für PKW 95% und für LKW 90% des Grundpreises.
Eine Methode toString() soll alle Fahrzeugdaten als String zurückzugeben.
Platzieren Sie die Klassen Fahrzeug, LKW und PKW in einem Package swe2014.fm.fahrzeuge .
3. Interface FahrzeugDAO
Dieses Interface definiert Methoden des Entwurfsmusters Data Access Object (DAO, engl. für Datenzugriffsobjekt) zur Erstellung persistenter Fahrzeugobjekte. Dieses Muster ermöglicht es, auf Daten unabhängig von der Art der benutzten Datenquelle zuzugreifen («weitere Information und ein konkretes Beispiel»).
Das Interface FahrzeugDAO soll folgende generische Methoden zum Einlesen und Speichern von Fahrzeugobjekten deklarieren.
Die Methode getFahrzeugList() soll eine Liste (z. B. java.util.ArrayList) benutzen, um alle persistent gespeicherten Fahrzeugobjekte zurückzugeben.
Die Methode getFahrzeugbyId(… id) soll, anhand der Fahrzeugnummer, ein Fahrzeug-Objekt zurückgeben. Falls das Fahrzeug nicht gefunden wird, soll die Methode null zurückgeben.
Die Methode speichereFahrzeug(Fahrzeug …) soll ein Fahrzeugobjekt persistent speichern. Stellen Sie sicher, dass beim Speichern eines neuen Fahrzeuges nicht die Fahrzeugnummer eines bereits gespeicherten Fahrzeug verwendet wird. Werfen Sie in diesem Fall eine IllegalArgumentException mit einer entsprechenden Fehlermeldung.
Die Methode loescheFahrzeug(Fahrzeug …) soll ein bestehendes Fahrzeug von der persistenten Datenquelle löschen. Falls es kein solches Fahrzeug gibt, soll IllegalArgumentException (mit entsprechender Fehlermeldung) geworfen werden.
Die Methode aktualisiereFahrzeug(Fahrzeug …) soll die Daten eines bestehenden Fahrzeug ändern. Dabei soll sie das Fahrzeug-Objekt suchen, in dem die Fahrzeugnummer den selben Wert besitzt wie im übergebenen Fahrzeug-Objekt. Auch diese Methode soll IllegalArgumentException werfen, falls das Fahrzeug nicht existiert.
4. Klasse SerializedFahrzeugDAO
Die Klasse SerializedFahrzeugDAO implementiert das Interface FahrzeugDAO.
Benutzen Sie zur persistenten Speicherung in SerializedFahrzeugDAO die Java-Standardserialisierung.
Der Klasse soll im Konstruktor ein String übergeben werden, der den Dateinamen bzw. Pfad der Datenquelle(n) enthält.
Achten Sie darauf, dass in Methoden, die in eine Datei schreiben, alle Instanzvariablen der Fahrzeugobjekte gesetzt bzw. nicht leer sind. Falls ein Wert fehlt, soll eine entsprechende IllegalArgumentException geworfen werden. Alle weiteren (nicht applikationsspezifischen) Systemfehler, z. B. Fehler aus Dateioperationen, sollen abgefangen und auf der Systemkonsole protokolliert werden (sie müssen nicht weitergeleitet werden).
Platzieren Sie das Interface FahrzeugDAO sowie die Klasse SerializedFahrzeugDAO in einem Package swe2014.fm.fahrzeuge.dao .