Java Academy · Pelajaran

Memilih Strategi Penyusunan Bersarang

Tentukan varian class bersarang berdasarkan keterkaitan, kebutuhan akses, dan keterbacaan.

Pelajaran 4 dari 414 langkah

Memilih Strategi Penyusunan Bersarang 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.

Memilih Strategi Penyusunan Bersarang yang Tepat

Java menyediakan empat opsi penyusunan bersarang: tingkat teratas, bersarang statis, dalam (nonstatis), dan lokal/anonim. Pilihan yang tepat bergantung pada keterikatan, kebutuhan akses, dan cakupan penggunaan ulang.

Pohon Keputusan

Ajukan pertanyaan berikut untuk memilih:

  1. Apakah kelas hanya digunakan di dalam kelas luar? → Pertimbangkan penyusunan bersarang
  2. Apakah kelas memerlukan instans kelas luar? → Kelas dalam; jika tidak → Kelas bersarang statis
  3. Apakah kelas hanya digunakan dalam satu metode? → Kelas lokal atau anonim
  4. Apakah kelas hanya mengimplementasikan satu metode? → Lambda

Kelas Tingkat Teratas

Gunakan kelas tingkat teratas saat tipe tersebut digunakan secara luas di seluruh basis kode, mewakili konsep domain penting, atau akan diimpor oleh banyak kelas lain.

// Top-level: used across many packages
public class Product {
    // ...
}

public interface Repository<T, ID> {
    Optional<T> findById(ID id);
    void save(T entity);
}

// These belong in separate .java files and are widely imported

Kelas Bersarang Statis

Gunakan kelas bersarang statis saat kelas tersebut hanya bermakna dalam konteks kelas luar, tidak memerlukan instans kelas luar, dan seharusnya dapat diakses dari luar.

class Graph {
    // Edge only makes sense in the context of a Graph
    public static class Edge {
        public final int from, to, weight;
        public Edge(int from, int to, int weight) {
            this.from = from; this.to = to; this.weight = weight;
        }
    }

    private List<Edge> edges = new ArrayList<>();

    public void addEdge(int from, int to, int weight) {
        edges.add(new Edge(from, to, weight));
    }
}

Kelas Dalam (Nonstatis)

Gunakan kelas dalam saat kelas tersebut memiliki keterkaitan konseptual yang kuat dengan instans kelas luar dan harus mengakses anggota privatnya—misalnya iterator atau objek pembantu yang sangat terkait.

class DataStore<T> {
    private final List<T> data;

    DataStore(List<T> data) { this.data = data; }

    // Must access data — inner class makes sense
    class Snapshot {
        private final List<T> copy;

        Snapshot() { this.copy = List.copyOf(data); } // accesses outer

        T get(int idx) { return copy.get(idx); }
        int size()     { return copy.size(); }
    }

    Snapshot snapshot() { return new Snapshot(); }
}

Kelas Lokal

Gunakan kelas lokal saat kelas tersebut hanya diperlukan dalam satu metode, cukup kompleks untuk memiliki beberapa metode atau status, dan Anda ingin menjaga cakupannya tetap minimal.

static int countWords(String text, boolean caseSensitive) {
    class WordCounter {
        Map<String, Integer> counts = new HashMap<>();

        void count(String word) {
            String key = caseSensitive ? word : word.toLowerCase();
            counts.merge(key, 1, Integer::sum);
        }

        int uniqueCount() { return counts.size(); }
    }

    WordCounter wc = new WordCounter();
    for (String w : text.split("\\s+")) wc.count(w);
    return wc.uniqueCount();
}
System.out.println(countWords("the cat sat on the mat", false)); // 5

Kelas Anonim vs Lambda

Gunakan kelas anonim saat diperlukan beberapa metode atau perluasan kelas abstrak. Gunakan lambda untuk antarmuka SAM.

// Lambda: clean for SAM
list.sort((a, b) -> a.compareTo(b));

// Anonymous: multi-method, or extending abstract class
java.util.TimerTask task = new java.util.TimerTask() {
    @Override public void run() { System.out.println("Tick!"); }
};
// TimerTask is abstract class — can't use lambda directly

Tabel Ringkasan

Referensi singkat:

  • Tingkat teratas: penggunaan ulang secara luas, tipe API publik
  • Bersarang statis: dikelompokkan secara logis, tidak memerlukan instans kelas luar
  • Dalam: sangat terkait dengan instans kelas luar, memerlukan akses privat
  • Lokal: cakupan metode, cukup kompleks untuk sebuah kelas
  • Anonim: implementasi sekali pakai, berumur pendek
  • Lambda: antarmuka SAM, tanpa status, ringkas

Praktik: Rancangan Klien HTTP

Menerapkan strategi penyusunan bersarang pada rancangan klien HTTP yang realistis.

class HttpClient {
    // Static nested: request config has no outer reference
    public static class RequestConfig {
        public final int timeoutMs;
        public final String userAgent;
        RequestConfig(int timeout, String ua) { this.timeoutMs = timeout; this.userAgent = ua; }
    }

    // Static nested: response is standalone data carrier
    public static class Response {
        public final int statusCode;
        public final String body;
        Response(int code, String body) { this.statusCode = code; this.body = body; }
    }

    private final RequestConfig config;
    HttpClient(RequestConfig config) { this.config = config; }

    public Response get(String url) {
        // Implementation using this.config
        return new Response(200, "body");
    }
}

Hindari Penyusunan Bersarang Berlebihan

Hindari penyusunan bersarang lebih dari satu tingkat. Kelas yang sangat bertingkat sulit dinavigasi dan diuji. Ekstrak kelas tersebut menjadi kelas tingkat teratas atau kelas tanpa pengubah akses jika mulai menjadi kompleks.

Alternatif Tanpa Pengubah Akses

Sebagai pengganti penyusunan bersarang, pertimbangkan untuk menjadikan kelas tanpa pengubah akses. Kelas tersebut hanya terlihat di dalam paket, tetapi lebih mudah diuji dan dipelihara daripada kelas bersarang.

// In package com.example.order:

// Package-private: visible in package, no nesting
class OrderLine {  // no 'public' modifier
    final String sku;
    final int qty;
    OrderLine(String sku, int qty) { this.sku = sku; this.qty = qty; }
}

// Public class in same package can use OrderLine freely
public class Order {
    private List<OrderLine> lines = new ArrayList<>();
    // ...
}

Rekaman dan Penyegelan sebagai Alternatif

Fitur Java modern—rekaman dan antarmuka tersegel—sering kali menghilangkan kebutuhan akan pola penyusunan bersarang yang kompleks.

// Instead of nested inner class hierarchy:
sealed interface Shape permits Circle, Rectangle, Triangle {}
record Circle(double r) implements Shape {}
record Rectangle(double w, double h) implements Shape {}
record Triangle(double b, double h) implements Shape {}

static double area(Shape s) {
    return switch (s) {
        case Circle c      -> Math.PI * c.r() * c.r();
        case Rectangle r   -> r.w() * r.h();
        case Triangle t    -> 0.5 * t.b() * t.h();
    };
}

Pemeriksaan Singkat

Kapan kelas dalam (nonstatis) menjadi pilihan yang lebih baik daripada kelas bersarang statis?

Ringkasan: Memilih Strategi Penyusunan Bersarang yang Tepat

Inti pembelajaran:

  • Tingkat teratas: tipe publik yang digunakan secara luas di seluruh basis kode
  • Bersarang statis: dikelompokkan secara logis dengan kelas luar, tidak memerlukan instans kelas luar
  • Kelas dalam: sangat terkait dengan instans kelas luar, mengakses anggota privat
  • Kelas lokal: cakupan metode, cukup kompleks untuk memiliki beberapa metode
  • Kelas anonim: sekali pakai, menggabungkan deklarasi dan pembuatan instans
  • Lambda: paling bersih untuk antarmuka SAM; pertimbangkan saat menggantikan kelas anonim
Gratis untuk memulai

Belajar Java dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
104
Pelajaran
374

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Memilih Strategi Penyusunan Bersarang” gratis?

Ya — teks lengkap “Memilih Strategi Penyusunan Bersarang” 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 “Memilih Strategi Penyusunan Bersarang”?

Tentukan varian class bersarang berdasarkan keterkaitan, kebutuhan akses, dan keterbacaan. 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 “Memilih Strategi Penyusunan Bersarang” 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. Class Bersarang Statis
  2. Class Dalam dan Akses ke Class Luar
  3. Class Lokal dan Anonim
  4. Memilih Strategi Penyusunan Bersarang
← Kembali ke Java Academy