Fahrzeugvermietungsdienst
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.
Schnittstellen können Mietverhalten definieren: Eine Rentable-Schnittstelle könnte Methoden wie rent(), returnVehicle() und calculateCost(int days) deklarieren. Verschiedene Fahrzeugtypen könnten Preisstrategien unterschiedlich implementieren, wodurch dies ein perfekter Anwendungsfall für Polymorphie ist.
Ü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
EinfachLass uns einen vollständigen Fahrzeugverleih entwickeln, der alles zusammenführt, was du über OOP gelernt hast! Du erstellst ein System, das eine Flotte verschiedener Fahrzeugtypen verwaltet, Vermietungen mit geeigneter Validierung abwickelt und ein Factory Pattern zum Erstellen von Fahrzeugen verwendet.
Du organisierst deinen Code über sieben Dateien:
RentalStatus.java: Erstelle ein Enum, das den Vermietungsstatus eines Fahrzeugs darstellt. Füge die WerteAVAILABLE,RENTEDundMAINTENANCEhinzu. Füge ein privates Felddescription(String), einen Konstruktor und einen Getter hinzu. AVAILABLE sollte die Beschreibung "ready to rent" haben, RENTED sollte "currently in use" haben und MAINTENANCE sollte "under service" haben.VehicleNotAvailableException.java: Erstelle eine benutzerdefinierte Exception, dieExceptionerweitert. Der Konstruktor sollte ein Kennzeichen akzeptieren und eine Nachricht im FormatVehicle not available: [licensePlate]erstellen.Rentable.java: Erstelle ein Interface, das Vermietungsoperationen definiert. Deklariere die Methodenrent(), die einen Boolean zurückgibt,returnVehicle(), die einen Boolean zurückgibt, undcalculateCost(int days), die einen Double zurückgibt.Vehicle.java: Erstelle eine abstrakte Basisklasse für alle Fahrzeuge. Füge private Felder fürlicensePlate(String),brand(String),dailyRate(Double) undstatus(RentalStatus, initialisiert auf AVAILABLE) hinzu. Der Konstruktor erhält licensePlate, brand und dailyRate. Füge geeignete Getter und einen Setter für status hinzu. Deklariere eine abstrakte MethodegetVehicleType(), die einen String zurückgibt. Implementiere eine MethodegetDetails(), die"[licensePlate] [brand] ([vehicleType]) - $[dailyRate]/day - [status description]"zurückgibt, wobei dailyRate mit 2 Dezimalstellen formatiert wird.Car.java: Erstelle eine Klasse, die Vehicle erweitert und Rentable implementiert. Füge ein privates Feldseats(int) hinzu. Der Konstruktor erhält licensePlate, brand, dailyRate und seats. ImplementieregetVehicleType()so, dass"Car"zurückgegeben wird. Beirent()soll der Status, wenn er AVAILABLE ist, auf RENTED gesetzt und true zurückgegeben werden; andernfalls soll false zurückgegeben werden. BeireturnVehicle()soll der Status, wenn er RENTED ist, auf AVAILABLE gesetzt und true zurückgegeben werden; andernfalls soll false zurückgegeben werden. BeicalculateCost(int days)soll dailyRate multipliziert mit days zurückgegeben werden.Motorcycle.java: Erstelle eine Klasse, die Vehicle erweitert und Rentable implementiert. Füge ein privates FeldengineCC(int) hinzu. Der Konstruktor erhält licensePlate, brand, dailyRate und engineCC. ImplementieregetVehicleType()so, dass"Motorcycle"zurückgegeben wird. Implementiere die Rentable-Methoden auf dieselbe Weise wie bei Car, abercalculateCost()soll einen Rabatt von 10 % anwenden (Multiplikation mit 0.9).RentalAgency.java: Erstelle eine Klasse, die die Fahrzeugflotte mit einer ArrayList verwaltet. Füge folgende Methoden hinzu:addVehicle(Vehicle vehicle)– fügt ein Fahrzeug zur Flotte hinzufindVehicle(String licensePlate)– gibt das Vehicle oder null zurückrentVehicle(String licensePlate, int days)– sucht das Fahrzeug, versucht, es zu vermieten (durch Umwandlung in Rentable), und gibt die Mietkosten zurück. WirfVehicleNotAvailableException, wenn das Fahrzeug nicht gefunden wurde oder wenn rent() false zurückgibtreturnVehicle(String licensePlate)– sucht das Fahrzeug und gibt es zurück, wobei bei Erfolg true zurückgegeben wirdgetAvailableVehicles()– gibt eine ArrayList von Fahrzeugen mit dem Status AVAILABLE zurück
Main.java: Erstelle deinen Fahrzeugverleih! Du erhältst einen durch Kommas getrennten Befehlsstring:ADD_CAR:licensePlate:brand:dailyRate:seatsADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCCRENT:licensePlate:daysRETURN:licensePlateAVAILABLE
Verarbeite jeden Befehl und gib Folgendes aus:
- ADD_CAR/ADD_MOTORCYCLE:
Added: [brand] ([vehicleType]) - RENT:
Rented [licensePlate] for [days] days - Total: $[cost](Kosten mit 2 Dezimalstellen) oderError: [exception message] - RETURN:
Returned: [licensePlate]oderReturn failed: [licensePlate] - AVAILABLE: Gib
Available vehicles:aus, gefolgt von den Details jedes verfügbaren Fahrzeugs in separaten Zeilen
Gib nach allen Befehlen
--- Fleet Summary ---aus, gefolgt von den Details jedes Fahrzeugs.
Du erhältst eine Eingabe: den durch Kommas getrennten Befehlsstring.
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 deine Ausgabe beispielsweise:
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 verbindet Vererbung (Vehicle-Hierarchie), Interfaces (Rentable), Enums (RentalStatus), benutzerdefinierte Exceptions, Polymorphismus (einheitlicher Umgang mit verschiedenen Fahrzeugtypen) und Komposition (RentalAgency verwaltet Fahrzeuge) zu einem vollständigen Fahrzeugverleihsystem!
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 Schlüsselwort thisMethodenFelder (Attribute)KonstruktormethodeÜberladen von KonstruktorenRückblick – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbung (extends)Das Schlüsselwort superÜberschreiben von Methoden (@Override)KonstruktorverkettungDie Object-KlasseEinfach- und mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenRückblick – Mitarbeiterhierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-SchnittstelleRückblick – Benutzerdefinierte Sortierung2Zugriffsmodifikatoren & Kapselung
Übersicht der ZugriffsebenenGetter- und Setter-MethodenInformationsverbergungDas Schlüsselwort finalRückblick – Bankkontoverwaltung5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, verschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Versiegelte Klassen (Java 17+)11Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBuilder-MusterObserver-MusterStrategie-Muster14Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungsdienst3Klassen-Props & statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Wiederholung – Counter & Utility6Schnittstellen & abstrakte Klassen
Einführung in InterfacesInterfaces implementierenMehrere Interfaces implementierenDefault & Static in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesRückblick – ZahlungssystemÜbe selbstständig: Online-Java-Compiler