Menu
CoddyTech

Layanan Penyewaan Kendaraan

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 87 dari 87.

Untuk tantangan terakhir ini, kamu akan membangun sistem Layanan Penyewaan Kendaraan yang menggabungkan semua konsep OOP yang telah kamu kuasai sepanjang kursus ini.

Sistemmu harus memodelkan armada dengan berbagai jenis kendaraan. Pertimbangkan class Vehicle sebagai basis dengan property umum seperti pelat nomor, merek, dan tarif sewa harian. Subclass seperti Car, Motorcycle, dan Truck dapat memperluasnya dengan atribut khusus seperti jumlah kursi, kapasitas mesin, atau kapasitas kargo.

Interface dapat mendefinisikan perilaku penyewaan: interface Rentable dapat mendeklarasikan method seperti rent(), returnVehicle(), dan calculateCost(int days). Berbagai jenis kendaraan dapat menerapkan strategi penetapan harga dengan cara yang berbeda, sehingga ini menjadi kasus penggunaan yang tepat untuk polimorfisme.

Pikirkan bagaimana class RentalAgency mengelola armada menggunakan komposisi.

Exception khusus seperti VehicleNotAvailableException dapat menangani kasus khusus.

Kamu mungkin menerapkan pola Factory untuk membuat kendaraan atau menggunakan enum untuk kategori kendaraan dan status penyewaan.

Tantangan ini menguji kemampuanmu merancang sistem OOP yang lengkap dan terstruktur dengan baik. Semoga berhasil!

challenge icon

Tantangan

Mudah

Mari kita bangun Layanan Penyewaan Kendaraan lengkap yang menggabungkan semua yang telah kamu pelajari tentang OOP! Kamu akan membuat sistem yang mengelola armada dengan berbagai jenis kendaraan, menangani penyewaan dengan validasi yang tepat, dan menggunakan pola factory untuk membuat kendaraan.

Kamu akan mengatur kodemu dalam tujuh file:

  • RentalStatus.java: Buat enum yang mewakili status penyewaan kendaraan. Sertakan nilai AVAILABLE, RENTED, dan MAINTENANCE. Tambahkan field privat description (String), constructor, dan getter. Status available harus memiliki deskripsi "ready to rent", status rented harus memiliki "currently in use", dan status maintenance harus memiliki "under service".
  • VehicleNotAvailableException.java: Buat exception khusus yang memperluas Exception. Constructor harus menerima pelat nomor dan membuat pesan dengan format Vehicle not available: [licensePlate].
  • Rentable.java: Buat interface yang mendefinisikan operasi penyewaan. Deklarasikan method rent() yang mengembalikan boolean, returnVehicle() yang mengembalikan boolean, dan calculateCost(int days) yang mengembalikan double.
  • Vehicle.java: Buat class dasar abstrak untuk semua kendaraan. Sertakan field privat untuk licensePlate (String), brand (String), dailyRate (double), dan status (RentalStatus, diinisialisasi ke AVAILABLE). Constructor menerima licensePlate, brand, dan dailyRate. Sertakan getter yang sesuai dan setter untuk status. Deklarasikan method abstrak getVehicleType() yang mengembalikan String. Implementasikan method getDetails() yang mengembalikan "[licensePlate] [brand] ([vehicleType]) - $[dailyRate]/day - [status description]" dengan dailyRate diformat menjadi 2 angka desimal.
  • Car.java: Buat class yang memperluas Vehicle dan mengimplementasikan Rentable. Tambahkan field privat seats (int). Constructor menerima licensePlate, brand, dailyRate, dan seats. Implementasikan getVehicleType() agar mengembalikan "Car". Untuk rent(), jika statusnya AVAILABLE, ubah menjadi RENTED dan kembalikan true; jika tidak, kembalikan false. Untuk returnVehicle(), jika statusnya RENTED, ubah menjadi AVAILABLE dan kembalikan true; jika tidak, kembalikan false. Untuk calculateCost(int days), kembalikan dailyRate dikalikan days.
  • Motorcycle.java: Buat class yang memperluas Vehicle dan mengimplementasikan Rentable. Tambahkan field privat engineCC (int). Constructor menerima licensePlate, brand, dailyRate, dan engineCC. Implementasikan getVehicleType() agar mengembalikan "Motorcycle". Implementasikan method Rentable dengan cara yang sama seperti pada Car, tetapi calculateCost() harus memberikan diskon 10% (kalikan dengan 0.9).
  • RentalAgency.java: Buat class yang mengelola armada kendaraan menggunakan ArrayList. Sertakan method berikut:
    • addVehicle(Vehicle vehicle) - menambahkan kendaraan ke armada
    • findVehicle(String licensePlate) - mengembalikan Vehicle atau null
    • rentVehicle(String licensePlate, int days) - mencari kendaraan, mencoba menyewakannya (melakukan casting ke Rentable), lalu mengembalikan biaya sewa. Lempar VehicleNotAvailableException jika kendaraan tidak ditemukan atau jika rent() mengembalikan false
    • returnVehicle(String licensePlate) - mencari dan mengembalikan kendaraan, dengan mengembalikan true jika berhasil
    • getAvailableVehicles() - mengembalikan ArrayList berisi kendaraan dengan status AVAILABLE
  • Main.java: Bangun layanan penyewaanmu! Kamu akan menerima string perintah yang dipisahkan dengan koma:
    • ADD_CAR:licensePlate:brand:dailyRate:seats
    • ADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCC
    • RENT:licensePlate:days
    • RETURN:licensePlate
    • AVAILABLE

    Proses setiap perintah dan cetak:

    • ADD_CAR/ADD_MOTORCYCLE: Added: [brand] ([vehicleType])
    • RENT: Rented [licensePlate] for [days] days - Total: $[cost] (biaya hingga 2 angka desimal), atau Error: [exception message]
    • RETURN: Returned: [licensePlate] atau Return failed: [licensePlate]
    • AVAILABLE: Cetak Available vehicles:, lalu detail setiap kendaraan yang tersedia pada baris terpisah

    Setelah semua perintah diproses, cetak --- Fleet Summary ---, lalu detail setiap kendaraan.

Kamu akan menerima satu input: string perintah yang dipisahkan dengan koma.

Contohnya, dengan 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, output-mu akan menjadi:

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

Tantangan ini menggabungkan inheritance (hierarki Vehicle), interface (Rentable), enum (RentalStatus), exception khusus, polymorphism (memperlakukan berbagai jenis kendaraan secara seragam), dan composition (RentalAgency mengelola kendaraan) menjadi sistem layanan penyewaan yang lengkap!

Coba sendiri

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: Buat instance RentalAgency
        
        // TODO: Pisahkan input berdasarkan koma untuk mendapatkan setiap perintah
        
        // TODO: Proses setiap perintah:
        // ADD_CAR:licensePlate:brand:dailyRate:seats -> cetak "Added: [brand] ([vehicleType])"
        // ADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCC -> cetak "Added: [brand] ([vehicleType])"
        // RENT:licensePlate:days -> cetak "Rented [licensePlate] for [days] days - Total: $[cost]" (2 angka di belakang koma)
        //                           atau "Error: [exception message]" jika terjadi exception
        // RETURN:licensePlate -> cetak "Returned: [licensePlate]" atau "Return failed: [licensePlate]"
        // AVAILABLE -> cetak "Available vehicles:", lalu detail setiap kendaraan yang tersedia
        
        // TODO: Setelah semua perintah diproses, cetak "--- Fleet Summary ---"
        // lalu detail setiap kendaraan
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online