Menyusun Program · Pelajaran 10 dari 10
Proyek: sistem peminjaman buku
12 menit baca · BelajarCode
Kita akan membangun sistem peminjaman buku sederhana dengan aturan:
- Setiap buku punya kode, judul, dan status tersedia atau dipinjam.
- Setiap anggota boleh meminjam paling banyak 2 buku sekaligus.
- Buku yang sedang dipinjam tidak bisa dipinjam orang lain.
Rancangan kelas
| Kelas | Tanggung jawab |
|---|---|
Buku | Menyimpan data buku dan statusnya |
Anggota | Menyimpan daftar buku yang sedang dipinjam |
Perpustakaan | Mengatur koleksi dan menegakkan aturan peminjaman |
PeminjamanException | Mewakili peminjaman yang melanggar aturan |
Java
1import java.util.ArrayList;2import java.util.List;34class PeminjamanException extends Exception {5 PeminjamanException(String pesan) {6 super(pesan);7 }8}910class Buku {11 private final String kode;12 private final String judul;13 private boolean dipinjam;1415 Buku(String kode, String judul) {16 this.kode = kode;17 this.judul = judul;18 }1920 String getKode() { return kode; }21 String getJudul() { return judul; }22 boolean isDipinjam() { return dipinjam; }23 void setDipinjam(boolean dipinjam) { this.dipinjam = dipinjam; }2425 @Override26 public String toString() {27 return kode + " " + judul + (dipinjam ? " (dipinjam)" : " (tersedia)");28 }29}3031class Anggota {32 static final int BATAS_PINJAM = 2;33 private final String nama;34 private final List<Buku> pinjaman = new ArrayList<>();3536 Anggota(String nama) {37 this.nama = nama;38 }3940 String getNama() { return nama; }41 List<Buku> getPinjaman() { return pinjaman; }42}4344class Perpustakaan {45 private final List<Buku> koleksi = new ArrayList<>();4647 void tambahBuku(Buku b) {48 koleksi.add(b);49 }5051 Buku cari(String kode) throws PeminjamanException {52 for (Buku b : koleksi) {53 if (b.getKode().equals(kode)) return b;54 }55 throw new PeminjamanException("Buku " + kode + " tidak ada di koleksi");56 }5758 void pinjam(Anggota a, String kode) throws PeminjamanException {59 Buku b = cari(kode);60 if (b.isDipinjam()) {61 throw new PeminjamanException(b.getJudul() + " sedang dipinjam");62 }63 if (a.getPinjaman().size() >= Anggota.BATAS_PINJAM) {64 throw new PeminjamanException(a.getNama() + " sudah meminjam " + Anggota.BATAS_PINJAM + " buku");65 }66 b.setDipinjam(true);67 a.getPinjaman().add(b);68 }6970 void kembalikan(Anggota a, String kode) throws PeminjamanException {71 Buku b = cari(kode);72 if (!a.getPinjaman().remove(b)) {73 throw new PeminjamanException(a.getNama() + " tidak sedang meminjam " + b.getJudul());74 }75 b.setDipinjam(false);76 }7778 void tampilkan() {79 for (Buku b : koleksi) System.out.println(" " + b);80 }81}8283public class Main {84 static void coba(String keterangan, Aksi aksi) {85 try {86 aksi.jalankan();87 System.out.println("OK " + keterangan);88 } catch (PeminjamanException e) {89 System.out.println("GAGAL " + keterangan + ": " + e.getMessage());90 }91 }9293 interface Aksi {94 void jalankan() throws PeminjamanException;95 }9697 public static void main(String[] args) {98 Perpustakaan p = new Perpustakaan();99 p.tambahBuku(new Buku("B01", "Algoritma Dasar"));100 p.tambahBuku(new Buku("B02", "Pemrograman Java"));101 p.tambahBuku(new Buku("B03", "Basis Data"));102103 Anggota dewi = new Anggota("Dewi");104 Anggota bagas = new Anggota("Bagas");105106 coba("Dewi pinjam B01", () -> p.pinjam(dewi, "B01"));107 coba("Bagas pinjam B01", () -> p.pinjam(bagas, "B01"));108 coba("Dewi pinjam B02", () -> p.pinjam(dewi, "B02"));109 coba("Dewi pinjam B03", () -> p.pinjam(dewi, "B03"));110 coba("Bagas kembalikan B02", () -> p.kembalikan(bagas, "B02"));111 coba("Dewi kembalikan B01", () -> p.kembalikan(dewi, "B01"));112 coba("Bagas pinjam B09", () -> p.pinjam(bagas, "B09"));113114 System.out.println("Status koleksi:");115 p.tampilkan();116 }117}OK Dewi pinjam B01 GAGAL Bagas pinjam B01: Algoritma Dasar sedang dipinjam OK Dewi pinjam B02 GAGAL Dewi pinjam B03: Dewi sudah meminjam 2 buku GAGAL Bagas kembalikan B02: Bagas tidak sedang meminjam Pemrograman Java OK Dewi kembalikan B01 GAGAL Bagas pinjam B09: Buku B09 tidak ada di koleksi Status koleksi: B01 Algoritma Dasar (tersedia) B02 Pemrograman Java (dipinjam) B03 Basis Data (tersedia)
Hal penting dari proyek ini
- Satu kelas, satu tanggung jawab.
Bukutidak tahu aturan peminjaman. Aturan dipusatkan diPerpustakaan, sehingga mudah diubah, misalnya jika batas pinjam dinaikkan. - Aturan dilanggar berarti exception. Pemanggil dipaksa menangani kemungkinan gagal, karena
PeminjamanExceptionadalah checked exception. - Konstanta
BATAS_PINJAMbersifatstatic final: milik kelas, bukan milik setiap objek, dan tidak bisa diubah. - Interface kecil
Aksidengan satu metode memungkinkan kode peminjaman dikirim sebagai lambda ke metodecoba.
Cek pemahaman
Kenapa aturan "paling banyak 2 buku" diletakkan di kelas Perpustakaan, bukan di Main?
Latihan
Cari buku berdasarkan kata kunci
Tambahkan metode List<Buku> cariJudul(String kataKunci) ke Perpustakaan yang mengembalikan semua buku yang judulnya mengandung kata kunci, tanpa membedakan huruf besar dan kecil.
Pembahasan
Java
1import java.util.ArrayList;2import java.util.List;34class Buku {5 private final String judul;67 Buku(String judul) {8 this.judul = judul;9 }1011 String getJudul() { return judul; }12}1314class Perpustakaan {15 private final List<Buku> koleksi = new ArrayList<>();1617 void tambahBuku(Buku b) { koleksi.add(b); }1819 List<Buku> cariJudul(String kataKunci) {20 String kunci = kataKunci.toLowerCase();21 List<Buku> hasil = new ArrayList<>();22 for (Buku b : koleksi) {23 if (b.getJudul().toLowerCase().contains(kunci)) hasil.add(b);24 }25 return hasil;26 }27}2829public class Main {30 public static void main(String[] args) {31 Perpustakaan p = new Perpustakaan();32 p.tambahBuku(new Buku("Algoritma Dasar"));33 p.tambahBuku(new Buku("Pemrograman Java"));34 p.tambahBuku(new Buku("Algoritma Lanjut dengan Java"));3536 for (Buku b : p.cariJudul("JAVA")) {37 System.out.println(b.getJudul());38 }39 }40}Pemrograman Java Algoritma Lanjut dengan Java
Kata kunci dan judul sama-sama diubah ke huruf kecil sebelum dibandingkan, sehingga "JAVA", "java", dan "Java" dianggap sama.
Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Java online.