Fahrzeugvermietung
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 87 von 87.
Für diese letzte Herausforderung wirst du ein Fahrzeugvermietungssystem bauen, das alle OOP-Konzepte zusammenführt, die du im Laufe dieses Kurses gemeistert hast.
Ihr System sollte eine Flotte verschiedener Fahrzeugtypen modellieren. Betrachten Sie eine Basisklasse Vehicle mit gemeinsamen Eigenschaften wie Kennzeichen, Marke und täglichem Mietsatz. Unterklassen wie Car, Motorcycle und Truck können diese um spezifische Attribute wie die Anzahl der Sitze, den Hubraum oder die Ladekapazität erweitern.
Interfaces können Mietverhalten definieren: Ein Rentable-Interface könnte Methoden wie rent(), returnVehicle() und calculateCost(int days) deklarieren. Verschiedene Fahrzeugtypen könnten Preisstrategien unterschiedlich implementieren, was dies zu einem perfekten Anwendungsfall für Polymorphismus macht.
Überlegen Sie, wie eine RentalAgency Klasse die Flotte mittels Komposition verwaltet.
Benutzerdefinierte Exceptions wie VehicleNotAvailableException können Sonderfälle behandeln.
Sie könnten das Factory-Pattern anwenden, um Fahrzeuge zu erstellen, oder Enums für Fahrzeugkategorien und den Mietstatus verwenden.
Diese Herausforderung testet Ihre Fähigkeit, ein vollständiges, gut strukturiertes OOP-System zu entwerfen. Viel Glück!
Aufgabe
EinfachLassen Sie uns einen kompletten Fahrzeugvermietungsservice aufbauen, der alles zusammenführt, was Sie über OOP gelernt haben! Sie erstellen ein System, das eine Flotte verschiedener Fahrzeugtypen verwaltet, Vermietungen mit ordnungsgemäßer Validierung abwickelt und ein Factory-Pattern zur Erstellung von Fahrzeugen verwendet.
Sie werden Ihren Code über sieben Dateien organisieren:
RentalStatus.java: Erstellen Sie ein Enum, das den Mietstatus eines Fahrzeugs darstellt. Fügen Sie die WerteAVAILABLE,RENTEDundMAINTENANCEhinzu. Fügen Sie ein privates Felddescription(String), einen Konstruktor und einen Getter hinzu.AVAILABLEsollte die Beschreibung "ready to rent" haben,RENTEDsollte "currently in use" haben undMAINTENANCEsollte "under service" haben.VehicleNotAvailableException.java: Erstellen Sie eine benutzerdefinierte Exception, dieExceptionerweitert. Der Konstruktor sollte ein Kennzeichen akzeptieren und eine Nachricht im FormatVehicle not available: [licensePlate]erstellen.Rentable.java: Erstellen Sie ein Interface, das Mietoperationen definiert. Deklarieren Sie die Methodenrent(), die einen boolean zurückgibt,returnVehicle(), die einen boolean zurückgibt, undcalculateCost(int days), die einen double zurückgibt.Vehicle.java: Erstellen Sie eine abstrakte Basisklasse für alle Fahrzeuge. Fügen Sie private Felder fürlicensePlate(String),brand(String),dailyRate(double) undstatus(RentalStatus, initialisiert aufAVAILABLE) hinzu. Der Konstruktor nimmtlicensePlate,brandunddailyRateentgegen. Fügen Sie entsprechende Getter und einen Setter fürstatushinzu. Deklarieren Sie eine abstrakte MethodegetVehicleType(), die einen String zurückgibt. Implementieren Sie einegetDetails()-Methode, die"[licensePlate] [brand] ([vehicleType]) - $[dailyRate]/day - [status description]"zurückgibt, wobeidailyRateauf 2 Dezimalstellen formatiert ist.Car.java: Erstellen Sie eine Klasse, dieVehicleerweitert undRentableimplementiert. Fügen Sie ein privates Feldseats(int) hinzu. Der Konstruktor nimmtlicensePlate,brand,dailyRateundseatsentgegen. Implementieren SiegetVehicleType()so, dass"Car"zurückgegeben wird. Fürrent(): Wenn der StatusAVAILABLEist, setzen Sie ihn aufRENTEDund geben Sietruezurück; andernfalls geben Siefalsezurück. FürreturnVehicle(): Wenn der StatusRENTEDist, setzen Sie ihn aufAVAILABLEund geben Sietruezurück; andernfalls geben Siefalsezurück. FürcalculateCost(int days)geben SiedailyRatemultipliziert mitdayszurück.Motorcycle.java: Erstellen Sie eine Klasse, dieVehicleerweitert undRentableimplementiert. Fügen Sie ein privates FeldengineCC(int) hinzu. Der Konstruktor nimmtlicensePlate,brand,dailyRateundengineCCentgegen. Implementieren SiegetVehicleType()so, dass"Motorcycle"zurückgegeben wird. Implementieren Sie dieRentable-Methoden auf die gleiche Weise wie beiCar, abercalculateCost()sollte einen Rabatt von 10 % anwenden (mit 0.9 multiplizieren).RentalAgency.java: Erstellen Sie eine Klasse, die die Fahrzeugflotte mithilfe einerArrayListverwaltet. Fügen Sie folgende Methoden hinzu:addVehicle(Vehicle vehicle)– fügt ein Fahrzeug zur Flotte hinzufindVehicle(String licensePlate)– gibt dasVehicleodernullzurückrentVehicle(String licensePlate, int days)– findet das Fahrzeug, versucht es zu mieten (Casting zuRentable) und gibt die Mietkosten zurück. Werfen Sie eineVehicleNotAvailableException, wenn das Fahrzeug nicht gefunden wird oder wennrent()falsezurückgibtreturnVehicle(String licensePlate)– findet und gibt das Fahrzeug zurück, gibt bei ErfolgtruezurückgetAvailableVehicles()– gibt eineArrayListvon Fahrzeugen mit dem StatusAVAILABLEzurück
Main.java: Bauen Sie Ihren Vermietungsservice! Sie erhalten einen durch Kommas getrennten String von Befehlen:ADD_CAR:licensePlate:brand:dailyRate:seatsADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCCRENT:licensePlate:daysRETURN:licensePlateAVAILABLE
Verarbeiten Sie jeden Befehl und geben Sie Folgendes aus:
- ADD_CAR/ADD_MOTORCYCLE:
Added: [brand] ([vehicleType]) - RENT:
Rented [licensePlate] for [days] days - Total: $[cost](Kosten auf 2 Dezimalstellen), oderError: [exception message] - RETURN:
Returned: [licensePlate]oderReturn failed: [licensePlate] - AVAILABLE: Geben Sie
Available vehicles:aus, gefolgt von den Details jedes verfügbaren Fahrzeugs in separaten Zeilen
Geben Sie nach allen Befehlen
--- Fleet Summary ---aus, gefolgt von den Details jedes Fahrzeugs.
Sie erhalten eine Eingabe: den durch Kommas getrennten Befehls-String.
Zum Beispiel bei der Eingabe ADD_CAR:ABC-123:Toyota:50.00:5,ADD_MOTORCYCLE:XYZ-789:Honda:40.00:600,RENT:ABC-123:3,RENT:ABC-123:2,AVAILABLE,RETURN:ABC-123 wäre Ihre Ausgabe:
Added: Toyota (Car)
Added: Honda (Motorcycle)
Rented ABC-123 for 3 days - Total: $150.00
Error: Vehicle not available: ABC-123
Available vehicles:
XYZ-789 Honda (Motorcycle) - $40.00/day - ready to rent
Returned: ABC-123
--- Fleet Summary ---
ABC-123 Toyota (Car) - $50.00/day - ready to rent
XYZ-789 Honda (Motorcycle) - $40.00/day - ready to rentDiese Herausforderung kombiniert Vererbung (Vehicle-Hierarchie), Interfaces (Rentable), Enums (RentalStatus), benutzerdefinierte Exceptions, Polymorphismus (einheitliche Behandlung verschiedener Fahrzeugtypen) und Komposition (RentalAgency verwaltet Fahrzeuge) zu einem vollständigen Vermietungsservice-System!
Probier es selbst
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
// TODO: Erstelle eine RentalAgency-Instanz
// TODO: Teile die Eingabe durch Kommas, um einzelne Befehle zu erhalten
// TODO: Verarbeite jeden Befehl:
// ADD_CAR:licensePlate:brand:dailyRate:seats -> gib "Added: [brand] ([vehicleType])" aus
// ADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCC -> gib "Added: [brand] ([vehicleType])" aus
// RENT:licensePlate:days -> gib "Rented [licensePlate] for [days] days - Total: $[cost]" aus (2 Dezimalstellen)
// oder "Error: [exception message]", falls eine Exception geworfen wird
// RETURN:licensePlate -> gib "Returned: [licensePlate]" oder "Return failed: [licensePlate]" aus
// AVAILABLE -> gib "Available vehicles:" aus, gefolgt von den Details jedes verfügbaren Fahrzeugs
// TODO: Gib nach allen Befehlen "--- Fleet Summary ---" aus
// gefolgt von den Details jedes Fahrzeugs
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas this-SchlüsselwortMethodenFelder (Attribute)Konstruktor-MethodeKonstruktor-ÜberladungRückblick – Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (extends)Das super-SchlüsselwortMethoden überschreiben (@Override)Konstruktor-VerkettungDie Object-KlasseEinfache & mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-InterfaceZusammenfassung – Benutzerdefiniertes Sortieren2Zugriffsmodifikatoren & Kapselung
Überblick über ZugriffsebenenGetter- und Setter-MethodenInformation HidingDas final-SchlüsselwortRückblick – Bankkonto-Manager5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenZusammenfassung – Formenrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, geschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Sealed Classes (Java 17+)11Design Patterns Teil 1
Einführung in Design PatternsSingleton-PatternFactory-PatternBuilder-PatternObserver-PatternStrategy-Pattern14Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung3Klasseneigenschaften & Statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Zusammenfassung – Zähler & Utility6Interfaces & Abstrakte Klassen
Einführung in InterfacesInterfaces implementierenImplementierung mehrerer InterfacesDefault- & statische Methoden in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesZusammenfassung - Zahlungssystem