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 yang terdiri dari berbagai jenis kendaraan. Pertimbangkan class dasar Vehicle 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 muatan.

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

Pikirkan bagaimana class RentalAgency mengelola armada menggunakan komposisi.

Pengecualian khusus seperti VehicleNotAvailableException dapat menangani kasus khusus.

Kamu bisa 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 buat Layanan Penyewaan Kendaraan lengkap yang menggabungkan semua hal tentang OOP yang telah kamu pelajari! 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 menyusun kodemu dalam tujuh file:

  • RentalStatus.java: Buat enum yang mewakili status penyewaan kendaraan. Sertakan nilai AVAILABLE, RENTED, dan MAINTENANCE. Tambahkan field private description (String), constructor, dan getter. Status available harus memiliki deskripsi "ready to rent", status rented harus memiliki deskripsi "currently in use", dan status maintenance harus memiliki deskripsi "under service".
  • VehicleNotAvailableException.java: Buat exception khusus yang merupakan turunan dari 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 abstract untuk semua kendaraan. Sertakan field private 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 abstract getVehicleType() yang mengembalikan String. Implementasikan method getDetails() yang mengembalikan "[licensePlate] [brand] ([vehicleType]) - $[dailyRate]/day - [status description]", dengan dailyRate diformat hingga 2 angka di belakang desimal.
  • Car.java: Buat class yang memperluas Vehicle dan mengimplementasikan Rentable. Tambahkan field private 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 private 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 menyewanya (dengan 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, serta 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] (cost dengan 2 angka di belakang 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, outputmu akan seperti ini:

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, polimorfisme (memperlakukan berbagai jenis kendaraan secara seragam), dan komposisi (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 desimal)
        //                           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