0Pricing
Java Academy · Pelajaran

Pola Builder dengan API Fluent

Bangun objek kompleks tahap demi tahap dengan builder fluent untuk menghindari konstruktor bertingkat.

Pola Builder dengan API Fluent adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Masalah Konstruktor Bertingkat

Ketika sebuah kelas memiliki banyak parameter opsional, jumlah konstruktor bertambah: 2 parameter, 3 parameter, 4 parameter, dan seterusnya. Pola Builder menyelesaikan masalah ini dengan API konfigurasi lancar yang dilakukan langkah demi langkah.

// Without builder — hard to read:
Pizza p = new Pizza("large", "thin", true, false, true, false, "mozzarella");

Struktur Dasar Builder

Buat kelas Builder bertingkat statis. Kelas luar memiliki konstruktor privat yang menerima builder. Setiap penyetel dalam builder mengembalikan this untuk memungkinkan perangkaian yang lancar.

public final class Pizza {
    private final String size, crustType, cheese;
    private final boolean extraSauce, pepperoni;
    private Pizza(Builder b) {
        this.size = b.size; this.crustType = b.crustType;
        this.cheese = b.cheese; this.extraSauce = b.extraSauce;
        this.pepperoni = b.pepperoni;
    }
    public static class Builder {
        private final String size;
        private String crustType = "regular", cheese = "mozzarella";
        private boolean extraSauce, pepperoni;
        public Builder(String size) { this.size = size; }
        public Builder crustType(String c) { this.crustType = c; return this; }
        public Builder cheese(String c)    { this.cheese = c;    return this; }
        public Builder extraSauce()        { this.extraSauce = true; return this; }
        public Builder pepperoni()         { this.pepperoni = true; return this; }
        public Pizza build()               { return new Pizza(this); }
    }
}

Penggunaan API Lancar

Builder dapat dibaca seperti sebuah kalimat. Parameter wajib ditempatkan dalam konstruktor; parameter opsional diberikan melalui pemanggilan metode. Pemanggilan akhir build() menghasilkan objek yang tidak dapat diubah.

Pizza p = new Pizza.Builder("large")
    .crustType("thin")
    .extraSauce()
    .pepperoni()
    .build();
System.out.println(p);

Validasi dalam build()

Tambahkan logika validasi di dalam build() sebelum membuat objek. Lempar IllegalStateException atau IllegalArgumentException untuk kombinasi yang tidak valid.

public Pizza build() {
    if (size == null || size.isBlank())
        throw new IllegalArgumentException("Size required");
    if (extraSauce && crustType.equals("stuffed"))
        throw new IllegalStateException("No extra sauce on stuffed crust");
    return new Pizza(this);
}

Builder untuk Objek yang Tidak Dapat Diubah

Karena kelas luar dibuat dari builder dalam satu langkah, semua bidang dapat bersifat final — sehingga objek yang dihasilkan sepenuhnya tidak dapat diubah dan aman untuk utas.

public final class Address {
    private final String street, city, country;
    private final String postalCode;
    private Address(Builder b) { ... } // all finals
    // no setters — immutable!
}

Builder Generik dengan Tipe Diri

Untuk hierarki pewarisan, gunakan parameter tipe generik rekursif (SELF extends Builder<SELF>) agar builder subkelas mengembalikan tipe subkelas dari metode yang dirangkai.

public abstract static class Builder<SELF extends Builder<SELF>> {
    String name;
    @SuppressWarnings("unchecked")
    public SELF name(String n) { this.name = n; return (SELF) this; }
    public abstract Vehicle build();
}

Lombok @Builder

Lombok menghasilkan seluruh infrastruktur builder saat waktu kompilasi melalui @Builder. Gunakan @Builder.Default untuk nilai bidang bawaan dan @Singular untuk koleksi.

@Builder
public class Report {
    private final String title;
    @Builder.Default private final int pageCount = 1;
    @Singular private final List<String> authors;
}
// Usage:
Report r = Report.builder().title("Q4").author("Alice").author("Bob").build();

Builder dalam JDK

Banyak kelas JDK menggunakan API bergaya builder: StringBuilder, HttpRequest.newBuilder(), ProcessBuilder, dan Stream.Builder. Kenali polanya.

HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://api.example.com/users"))
    .header("Accept", "application/json")
    .GET()
    .build();

Builder vs Pabrik

Gunakan Builder ketika objek memerlukan banyak parameter dan konfigurasi bertahap. Gunakan pabrik ketika semua varian sederhana dan pembuatan dapat dilakukan dalam satu pemanggilan.

Builder untuk Data Pengujian

Builder sangat berguna dalam pengujian: buat builder dasar di sebuah pembantu, lalu timpa hanya bidang yang relevan untuk setiap kasus pengujian — sehingga pengujian tetap mengikuti DRY dan mudah dibaca.

User defaultUser() { return new User.Builder("test@example.com").name("Test User").build(); }
User adminUser()   { return new User.Builder("admin@example.com").name("Admin").role(ADMIN).build(); }

Keamanan Utas

Builder itu sendiri tidak aman untuk utas — jangan bagikan satu Builder ke beberapa utas. Produk yang dibuat darinya dapat bersifat tidak dapat diubah dan aman untuk utas jika semua bidang bersifat final dan tidak ada objek yang dapat diubah yang dibagikan.

Pemeriksaan Singkat

Apa yang membuat metode builder bersifat "berantai"?

Ringkasan

Builder menyelesaikan masalah konstruktor bertingkat. Gunakan kelas Builder bertingkat statis, kembalikan this dari setiap penyetel, lakukan validasi dalam build(), dan hasilkan objek yang tidak dapat diubah. Lombok @Builder mengotomatiskan kode pendukungnya.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pola Builder dengan API Fluent” gratis?

Ya — teks lengkap “Pola Builder dengan API Fluent” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pola Builder dengan API Fluent”?

Bangun objek kompleks tahap demi tahap dengan builder fluent untuk menghindari konstruktor bertingkat. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Pola Builder dengan API Fluent” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Singleton: Implementasi Aman bagi Thread
  2. Pola Factory Method
  3. Abstract Factory untuk Keluarga Produk
  4. Pola Builder dengan API Fluent
← Kembali ke Java Academy