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 dan tanggung jawabnya
KelasTanggung jawab
BukuMenyimpan data buku dan statusnya
AnggotaMenyimpan daftar buku yang sedang dipinjam
PerpustakaanMengatur koleksi dan menegakkan aturan peminjaman
PeminjamanExceptionMewakili 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}
Sistem peminjaman buku
Keluaran
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. Buku tidak tahu aturan peminjaman. Aturan dipusatkan di Perpustakaan, sehingga mudah diubah, misalnya jika batas pinjam dinaikkan.
  • Aturan dilanggar berarti exception. Pemanggil dipaksa menangani kemungkinan gagal, karena PeminjamanException adalah checked exception.
  • Konstanta BATAS_PINJAM bersifat static final: milik kelas, bukan milik setiap objek, dan tidak bisa diubah.
  • Interface kecil Aksi dengan satu metode memungkinkan kode peminjaman dikirim sebagai lambda ke metode coba.

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.

Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Java online.

Tandai pelajaran ini selesai

Masuk ke aplikasi untuk mencatat kemajuan, lalu lanjutkan ke pelajaran berikutnya dari perangkat mana pun.

Buka di aplikasi