Menu
Coddy logo textTech

Serviço de Aluguel de Veículos

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 87 de 87.

Para este desafio final, você construirá um sistema de Serviço de Aluguel de Veículos que reúne todos os conceitos de POO que você dominou ao longo deste curso.

Seu sistema deve modelar uma frota de diferentes tipos de veículos. Considere uma classe base Vehicle com propriedades comuns como placa, marca e valor da diária de aluguel. Subclasses como Car, Motorcycle e Truck podem estender isso com atributos específicos como número de assentos, cilindrada ou capacidade de carga.

As interfaces podem definir comportamentos de aluguel: uma interface Rentable pode declarar métodos como rent(), returnVehicle() e calculateCost(int days). Diferentes tipos de veículos poderiam implementar estratégias de precificação de maneiras diferentes, tornando este um caso de uso perfeito para o polimorfismo.

Pense em como uma classe RentalAgency gerencia a frota usando composição.

Exceções personalizadas como VehicleNotAvailableException podem lidar com casos extremos.

Você pode aplicar o padrão Factory para criar veículos ou usar enums para categorias de veículos e status de aluguel.

Este desafio testa sua habilidade de projetar um sistema OOP completo e bem estruturado. Boa sorte!

challenge icon

Desafio

Fácil

Vamos criar um Serviço completo de Aluguel de Veículos que reúne tudo o que você aprendeu sobre POO! Você criará um sistema que gerencia uma frota de diferentes tipos de veículos, lida com aluguéis com validação adequada e usa um padrão de fábrica para criar veículos.

Você organizará seu código em sete arquivos:

  • RentalStatus.java: Crie um enum que represente o status de aluguel de um veículo. Inclua os valores AVAILABLE, RENTED e MAINTENANCE. Adicione um campo privado description (String), um construtor e um getter. Available deve ter a descrição "ready to rent", rented deve ter "currently in use" e maintenance deve ter "under service".
  • VehicleNotAvailableException.java: Crie uma exceção personalizada que estenda Exception. O construtor deve aceitar uma placa e criar uma mensagem no formato Vehicle not available: [licensePlate].
  • Rentable.java: Crie uma interface que defina as operações de aluguel. Declare os métodos rent(), que retorna um booleano, returnVehicle(), que retorna um booleano, e calculateCost(int days), que retorna um double.
  • Vehicle.java: Crie uma classe base abstrata para todos os veículos. Inclua campos privados para licensePlate (String), brand (String), dailyRate (double) e status (RentalStatus, inicializado como AVAILABLE). O construtor recebe licensePlate, brand e dailyRate. Inclua getters apropriados e um setter para status. Declare um método abstrato getVehicleType() que retorne uma String. Implemente um método getDetails() que retorne "[licensePlate] [brand] ([vehicleType]) - $[dailyRate]/day - [status description]", com dailyRate formatado para 2 casas decimais.
  • Car.java: Crie uma classe que estenda Vehicle e implemente Rentable. Adicione um campo privado seats (int). O construtor recebe licensePlate, brand, dailyRate e seats. Implemente getVehicleType() para retornar "Car". Para rent(), se o status for AVAILABLE, altere-o para RENTED e retorne true; caso contrário, retorne false. Para returnVehicle(), se o status for RENTED, altere-o para AVAILABLE e retorne true; caso contrário, retorne false. Para calculateCost(int days), retorne dailyRate multiplicado por days.
  • Motorcycle.java: Crie uma classe que estenda Vehicle e implemente Rentable. Adicione um campo privado engineCC (int). O construtor recebe licensePlate, brand, dailyRate e engineCC. Implemente getVehicleType() para retornar "Motorcycle". Implemente os métodos de Rentable da mesma forma que em Car, mas calculateCost() deve aplicar um desconto de 10% (multiplicar por 0.9).
  • RentalAgency.java: Crie uma classe que gerencie a frota de veículos usando um ArrayList. Inclua os métodos:
    • addVehicle(Vehicle vehicle) - adiciona um veículo à frota
    • findVehicle(String licensePlate) - retorna o Vehicle ou null
    • rentVehicle(String licensePlate, int days) - encontra o veículo, tenta alugá-lo (fazendo cast para Rentable) e retorna o custo do aluguel. Lance VehicleNotAvailableException se o veículo não for encontrado ou se rent() retornar false
    • returnVehicle(String licensePlate) - encontra e devolve o veículo, retornando true em caso de sucesso
    • getAvailableVehicles() - retorna um ArrayList de veículos com status AVAILABLE
  • Main.java: Crie seu serviço de aluguel! Você receberá uma string de comandos separados por vírgulas:
    • ADD_CAR:licensePlate:brand:dailyRate:seats
    • ADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCC
    • RENT:licensePlate:days
    • RETURN:licensePlate
    • AVAILABLE

    Processe cada comando e imprima:

    • ADD_CAR/ADD_MOTORCYCLE: Added: [brand] ([vehicleType])
    • RENT: Rented [licensePlate] for [days] days - Total: $[cost] (custo com 2 casas decimais) ou Error: [exception message]
    • RETURN: Returned: [licensePlate] ou Return failed: [licensePlate]
    • AVAILABLE: Imprima Available vehicles: seguido pelos detalhes de cada veículo disponível, em linhas separadas

    Depois de todos os comandos, imprima --- Fleet Summary --- seguido pelos detalhes de cada veículo.

Você receberá uma entrada: a string de comandos separados por vírgulas.

Por exemplo, com a entrada 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, sua saída seria:

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

Este desafio combina herança (hierarquia Vehicle), interfaces (Rentable), enums (RentalStatus), exceções personalizadas, polimorfismo (tratando diferentes tipos de veículos de maneira uniforme) e composição (RentalAgency gerenciando veículos) em um sistema completo de aluguel de veículos!

Experimente você mesmo

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: Criar uma instância de RentalAgency
        
        // TODO: Dividir a entrada por vírgula para obter comandos individuais
        
        // TODO: Processar cada comando:
        // ADD_CAR:licensePlate:brand:dailyRate:seats -> imprimir "Added: [brand] ([vehicleType])"
        // ADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCC -> imprimir "Added: [brand] ([vehicleType])"
        // RENT:licensePlate:days -> imprimir "Rented [licensePlate] for [days] days - Total: $[cost]" (2 casas decimais)
        //                           ou "Error: [exception message]" se uma exceção for lançada
        // RETURN:licensePlate -> imprimir "Returned: [licensePlate]" ou "Return failed: [licensePlate]"
        // AVAILABLE -> imprimir "Available vehicles:" seguido pelos detalhes de cada veículo disponível
        
        // TODO: Após todos os comandos, imprimir "--- Fleet Summary ---"
        // seguido pelos detalhes de cada veículo
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Java online