Menu
Coddy logo textTech

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!

challenge icon

Sfida

Facile

Costruiamo 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 valori AVAILABLE, RENTED e MAINTENANCE. Aggiungi un campo privato description (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 estende Exception. Il costruttore dovrebbe accettare una targa e creare un messaggio nel formato Vehicle not available: [licensePlate].
  • Rentable.java: Crea un'interfaccia che definisce le operazioni di noleggio. Dichiara i metodi rent(), che restituisce un boolean, returnVehicle(), che restituisce un boolean, e calculateCost(int days), che restituisce un double.
  • Vehicle.java: Crea una classe base astratta per tutti i veicoli. Includi campi privati per licensePlate (String), brand (String), dailyRate (double) e status (RentalStatus, inizializzato a AVAILABLE). Il costruttore accetta licensePlate, brand e dailyRate. Includi i getter appropriati e un setter per status. Dichiara un metodo astratto getVehicleType() che restituisce una String. Implementa un metodo getDetails() 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 privato seats (int). Il costruttore accetta licensePlate, brand, dailyRate e seats. Implementa getVehicleType() in modo che restituisca "Car". Per rent(), se lo stato è AVAILABLE, impostalo su RENTED e restituisci true; altrimenti restituisci false. Per returnVehicle(), se lo stato è RENTED, impostalo su AVAILABLE e restituisci true; altrimenti restituisci false. Per calculateCost(int days), restituisci dailyRate moltiplicato per days.
  • Motorcycle.java: Crea una classe che estende Vehicle e implementa Rentable. Aggiungi un campo privato engineCC (int). Il costruttore accetta licensePlate, brand, dailyRate ed engineCC. Implementa getVehicleType() in modo che restituisca "Motorcycle". Implementa i metodi di Rentable come per Car, ma calculateCost() 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 flotta
    • findVehicle(String licensePlate) - restituisce il Vehicle oppure null
    • rentVehicle(String licensePlate, int days) - trova il veicolo, prova a noleggiarlo (eseguendo il cast a Rentable) e restituisce il costo del noleggio. Lancia VehicleNotAvailableException se il veicolo non viene trovato o se rent() restituisce false
    • returnVehicle(String licensePlate) - trova e restituisce il veicolo, restituendo true in caso di successo
    • getAvailableVehicles() - 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:seats
    • ADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCC
    • RENT:licensePlate:days
    • RETURN:licensePlate
    • AVAILABLE

    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), oppure Error: [exception message]
    • RETURN: Returned: [licensePlate] oppure Return 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 rent

Questa 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
    }
}
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Java online