Servizio di noleggio veicoli
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 87 di 87.
Per questa sfida finale, realizzerai un sistema di servizio di noleggio veicoli che riunisce tutti i concetti di OOP che hai appreso durante questo corso.
Il tuo sistema dovrebbe modellare una flotta di diversi tipi di veicoli. Considera una classe base Vehicle con proprietà comuni come targa, marca e tariffa giornaliera di noleggio. Le sottoclassi come Car, Motorcycle e Truck possono estenderla con attributi specifici come il numero di posti, la cilindrata o la capacità di carico.
Le interfacce possono definire i comportamenti di noleggio: un'interfaccia Rentable potrebbe dichiarare metodi come rent(), returnVehicle() e calculateCost(int days). Diversi tipi di veicoli potrebbero implementare strategie di tariffazione differenti, rendendo questo un caso d'uso perfetto per il polimorfismo.
Pensa a come una classe RentalAgency gestisce la flotta usando la composizione.
Le eccezioni personalizzate come VehicleNotAvailableException possono gestire i casi limite.
Potresti applicare il pattern Factory per creare veicoli oppure usare gli enum per le categorie dei veicoli e lo stato del noleggio.
Questa sfida mette alla prova la tua capacità di progettare un sistema OOP completo e ben strutturato. Buona fortuna!
Sfida
FacileCostruiamo un servizio completo di noleggio veicoli che riunisce tutto ciò che hai imparato sulla programmazione orientata agli oggetti! Creerai un sistema che gestisce una flotta di diversi tipi di veicoli, gestisce i noleggi con le opportune convalide e usa il pattern factory per creare veicoli.
Organizzerai il codice in sette file:
RentalStatus.java: Crea un enum che rappresenta lo stato di noleggio di un veicolo. Includi i valoriAVAILABLE,RENTEDeMAINTENANCE. Aggiungi un campo privatodescription(String), un costruttore e un getter. AVAILABLE dovrebbe avere la descrizione "ready to rent", RENTED dovrebbe avere "currently in use" e MAINTENANCE dovrebbe avere "under service".VehicleNotAvailableException.java: Crea un'eccezione personalizzata che estendeException. Il costruttore dovrebbe accettare una targa e creare un messaggio nel formatoVehicle not available: [licensePlate].Rentable.java: Crea un'interfaccia che definisce le operazioni di noleggio. Dichiara i metodirent(), che restituisce un boolean,returnVehicle(), che restituisce un boolean, ecalculateCost(int days), che restituisce un double.Vehicle.java: Crea una classe base astratta per tutti i veicoli. Includi campi privati perlicensePlate(String),brand(String),dailyRate(double) estatus(RentalStatus, inizializzato a AVAILABLE). Il costruttore accetta licensePlate, brand e dailyRate. Includi i getter appropriati e un setter per status. Dichiara un metodo astrattogetVehicleType()che restituisce una String. Implementa un metodogetDetails()che restituisce"[licensePlate] [brand] ([vehicleType]) - $[dailyRate]/day - [status description]", con dailyRate formattato a 2 cifre decimali.Car.java: Crea una classe che estende Vehicle e implementa Rentable. Aggiungi un campo privatoseats(int). Il costruttore accetta licensePlate, brand, dailyRate e seats. ImplementagetVehicleType()in modo che restituisca"Car". Perrent(), se lo stato è AVAILABLE, impostalo su RENTED e restituisci true; altrimenti restituisci false. PerreturnVehicle(), se lo stato è RENTED, impostalo su AVAILABLE e restituisci true; altrimenti restituisci false. PercalculateCost(int days), restituisci dailyRate moltiplicato per days.Motorcycle.java: Crea una classe che estende Vehicle e implementa Rentable. Aggiungi un campo privatoengineCC(int). Il costruttore accetta licensePlate, brand, dailyRate ed engineCC. ImplementagetVehicleType()in modo che restituisca"Motorcycle". Implementa i metodi di Rentable come per Car, macalculateCost()dovrebbe applicare uno sconto del 10% (moltiplicare per 0.9).RentalAgency.java: Crea una classe che gestisce la flotta di veicoli usando un ArrayList. Includi i metodi:addVehicle(Vehicle vehicle)- aggiunge un veicolo alla flottafindVehicle(String licensePlate)- restituisce il Vehicle oppure nullrentVehicle(String licensePlate, int days)- trova il veicolo, prova a noleggiarlo (eseguendo il cast a Rentable) e restituisce il costo del noleggio. LanciaVehicleNotAvailableExceptionse il veicolo non viene trovato o se rent() restituisce falsereturnVehicle(String licensePlate)- trova e restituisce il veicolo, restituendo true in caso di successogetAvailableVehicles()- restituisce un ArrayList di veicoli con stato AVAILABLE
Main.java: Crea il tuo servizio di noleggio! Riceverai una stringa di comandi separati da virgole:ADD_CAR:licensePlate:brand:dailyRate:seatsADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCCRENT:licensePlate:daysRETURN:licensePlateAVAILABLE
Elabora ogni comando e stampa:
- ADD_CAR/ADD_MOTORCYCLE:
Added: [brand] ([vehicleType]) - RENT:
Rented [licensePlate] for [days] days - Total: $[cost](costo a 2 cifre decimali), oppureError: [exception message] - RETURN:
Returned: [licensePlate]oppureReturn failed: [licensePlate] - AVAILABLE: Stampa
Available vehicles:seguito dai dettagli di ogni veicolo disponibile, ciascuno su una riga separata
Dopo tutti i comandi, stampa
--- Fleet Summary ---seguito dai dettagli di ogni veicolo.
Riceverai un input: la stringa di comandi separati da virgole.
Per esempio, con l'input 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, il tuo output sarà:
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 rentQuesta sfida combina l'ereditarietà (gerarchia Vehicle), le interfacce (Rentable), gli enum (RentalStatus), le eccezioni personalizzate, il polimorfismo (trattare in modo uniforme diversi tipi di veicolo) e la composizione (RentalAgency che gestisce i veicoli) in un sistema completo di noleggio veicoli!
Provalo tu
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: Crea un'istanza di RentalAgency
// TODO: Dividi l'input in corrispondenza delle virgole per ottenere i singoli comandi
// TODO: Elabora ogni comando:
// ADD_CAR:licensePlate:brand:dailyRate:seats -> stampa "Added: [brand] ([vehicleType])"
// ADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCC -> stampa "Added: [brand] ([vehicleType])"
// RENT:licensePlate:days -> stampa "Rented [licensePlate] for [days] days - Total: $[cost]" (2 decimali)
// oppure "Error: [exception message]" se viene sollevata un'eccezione
// RETURN:licensePlate -> stampa "Returned: [licensePlate]" oppure "Return failed: [licensePlate]"
// AVAILABLE -> stampa "Available vehicles:" seguito dai dettagli di ogni veicolo disponibile
// TODO: Dopo tutti i comandi, stampa "--- Fleet Summary ---"
// seguito dai dettagli di ogni veicolo
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy14Sfide finali
Piattaforma di e-learningSistema bancarioSviluppo del personaggio di un giocoServizio di noleggio veicoli3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online