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!
Tantangan
MudahMari 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 nilaiAVAILABLE,RENTED, danMAINTENANCE. Tambahkan field privatdescription(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 memperluasException. Constructor harus menerima pelat nomor dan membuat pesan dengan formatVehicle not available: [licensePlate].Rentable.java: Buat interface yang mendefinisikan operasi penyewaan. Deklarasikan methodrent()yang mengembalikan boolean,returnVehicle()yang mengembalikan boolean, dancalculateCost(int days)yang mengembalikan double.Vehicle.java: Buat class dasar abstrak untuk semua kendaraan. Sertakan field privat untuklicensePlate(String),brand(String),dailyRate(double), danstatus(RentalStatus, diinisialisasi ke AVAILABLE). Constructor menerima licensePlate, brand, dan dailyRate. Sertakan getter yang sesuai dan setter untuk status. Deklarasikan method abstrakgetVehicleType()yang mengembalikan String. Implementasikan methodgetDetails()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 privatseats(int). Constructor menerima licensePlate, brand, dailyRate, dan seats. ImplementasikangetVehicleType()agar mengembalikan"Car". Untukrent(), jika statusnya AVAILABLE, ubah menjadi RENTED dan kembalikan true; jika tidak, kembalikan false. UntukreturnVehicle(), jika statusnya RENTED, ubah menjadi AVAILABLE dan kembalikan true; jika tidak, kembalikan false. UntukcalculateCost(int days), kembalikan dailyRate dikalikan days.Motorcycle.java: Buat class yang memperluas Vehicle dan mengimplementasikan Rentable. Tambahkan field privatengineCC(int). Constructor menerima licensePlate, brand, dailyRate, dan engineCC. ImplementasikangetVehicleType()agar mengembalikan"Motorcycle". Implementasikan method Rentable dengan cara yang sama seperti pada Car, tetapicalculateCost()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 armadafindVehicle(String licensePlate)- mengembalikan Vehicle atau nullrentVehicle(String licensePlate, int days)- mencari kendaraan, mencoba menyewakannya (melakukan casting ke Rentable), lalu mengembalikan biaya sewa. LemparVehicleNotAvailableExceptionjika kendaraan tidak ditemukan atau jika rent() mengembalikan falsereturnVehicle(String licensePlate)- mencari dan mengembalikan kendaraan, dengan mengembalikan true jika berhasilgetAvailableVehicles()- 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:seatsADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCCRENT:licensePlate:daysRETURN:licensePlateAVAILABLE
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), atauError: [exception message] - RETURN:
Returned: [licensePlate]atauReturn 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 rentTantangan 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
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy14Tantangan Akhir
Platform E-LearningSistem PerbankanPengembangan Karakter GameLayanan Penyewaan Kendaraan3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem PembayaranLatihan sendiri: Compiler Java online