0Pricing
Java Academy · Pelajaran

switch Menyeluruh pada Sealed

Kelengkapan saat kompilasi.

switch Menyeluruh pada Sealed 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.

Pencabangan Menyeluruh

Ketika Anda menggunakan switch atas tipe tersegel, kompilator mengetahui setiap subtipe yang diizinkan. Jika pencabangan Anda mencakup semuanya, pencabangan tersebut bersifat menyeluruh dan Anda tidak memerlukan cabang bawaan.

Pencabangan dengan Pola Tipe

Ekspresi switch dapat mencocokkan tipe waktu berjalan dari suatu nilai tersegel menggunakan pola tipe.

public class Main {
    sealed interface Shape permits Circle, Square {}
    record Circle(double radius) implements Shape {}
    record Square(double side) implements Shape {}

    static String describe(Shape s) {
        return switch (s) {
            case Circle c -> "circle r=" + c.radius();
            case Square sq -> "square s=" + sq.side();
        };
    }

    public static void main(String[] args) {
        System.out.println(describe(new Circle(2)));
        System.out.println(describe(new Square(3)));
    }
}

Tidak Memerlukan Cabang Bawaan

Karena Circle dan Square merupakan satu-satunya subtipe yang diizinkan, kompilator menerima switch tersebut sebagai sesuatu yang lengkap. Menambahkan default akan berlebihan.

Kelengkapan Saat Kompilasi

Jika Anda menambahkan subtipe yang diizinkan dan kemudian lupa menanganinya, setiap pencabangan menyeluruh gagal dikompilasi. Dengan demikian, seluruh kelas kesalahan saat berjalan dapat diubah menjadi kesalahan kompilasi.

Menghitung Result

Ekspresi switch menyeluruh sangat cocok untuk mengolah suatu nilai menjadi hasil seperti luas.

public class Main {
    sealed interface Shape permits Circle, Square {}
    record Circle(double radius) implements Shape {}
    record Square(double side) implements Shape {}

    static double area(Shape s) {
        return switch (s) {
            case Circle c -> Math.PI * c.radius() * c.radius();
            case Square sq -> sq.side() * sq.side();
        };
    }

    public static void main(String[] args) {
        System.out.printf("%.2f%n", area(new Circle(1)));
        System.out.printf("%.2f%n", area(new Square(2)));
    }
}

Pernyataan Pencabangan vs Ekspresi

Kelengkapan berlaku pada ekspresi switch (yang menghasilkan nilai) dan pada pernyataan switch yang menggunakan bentuk panah untuk tipe tersegel. Kompilator memberlakukan cakupan penuh.

Menangani Nilai Kosong

Secara bawaan, switch pada suatu referensi akan melempar NullPointerException jika nilainya kosong. Anda dapat menambahkan label case null untuk menanganinya secara eksplisit.

public class Main {
    sealed interface Shape permits Circle, Square {}
    record Circle(double radius) implements Shape {}
    record Square(double side) implements Shape {}

    static String describe(Shape s) {
        return switch (s) {
            case null -> "no shape";
            case Circle c -> "circle";
            case Square sq -> "square";
        };
    }

    public static void main(String[] args) {
        System.out.println(describe(null));
        System.out.println(describe(new Circle(1)));
    }
}

Penjaga Tidak Menghilangkan Kelengkapan

Anda dapat menambahkan penjaga when untuk mempersempit kasus, tetapi kasus yang hanya memiliki penjaga tidak membuat suatu tipe tercakup. Anda tetap memerlukan kasus tanpa penjaga untuk setiap subtipe agar tetap menyeluruh.

public class Main {
    sealed interface Shape permits Circle, Square {}
    record Circle(double radius) implements Shape {}
    record Square(double side) implements Shape {}

    static String size(Shape s) {
        return switch (s) {
            case Circle c when c.radius() > 10 -> "big circle";
            case Circle c -> "small circle";
            case Square sq -> "square";
        };
    }

    public static void main(String[] args) {
        System.out.println(size(new Circle(20)));
        System.out.println(size(new Circle(2)));
    }
}

Pencabangan pada Kelas Tersegel

Kelengkapan yang sama juga berlaku untuk kelas tersegel, bukan hanya antarmuka.

public class Main {
    sealed static abstract class Token permits Word, Number {}
    static final class Word extends Token { final String text; Word(String t){text=t;} }
    static final class Number extends Token { final int value; Number(int v){value=v;} }

    static String show(Token t) {
        return switch (t) {
            case Word w -> "word:" + w.text;
            case Number n -> "num:" + n.value;
        };
    }

    public static void main(String[] args) {
        System.out.println(show(new Word("hi")));
        System.out.println(show(new Number(7)));
    }
}

Mengapa Ini Sangat Berguna

Pencabangan menyeluruh yang dipadukan dengan tipe tersegel menghasilkan kode yang aman dan mudah dikembangkan. Himpunan kasus didokumentasikan di satu tempat, dan kompilator menjamin bahwa Anda tidak pernah melewatkan satu pun ketika model berkembang.

Contoh Lengkap

Di sini, tipe Result tersegel diolah menjadi pesan dengan cakupan penuh.

public class Main {
    sealed interface Result permits Ok, Err {}
    record Ok(int value) implements Result {}
    record Err(String message) implements Result {}

    static String render(Result r) {
        return switch (r) {
            case Ok ok -> "value = " + ok.value();
            case Err err -> "error: " + err.message();
        };
    }

    public static void main(String[] args) {
        System.out.println(render(new Ok(10)));
        System.out.println(render(new Err("bad input")));
    }
}

Pemeriksaan Singkat

Ujilah pemahaman Anda tentang pencabangan menyeluruh.

Rangkuman

Anda telah mempelajari pencabangan menyeluruh pada tipe tersegel.

  • Mencakup semua subtipe yang diizinkan membuat pencabangan menjadi menyeluruh, sehingga default tidak diperlukan.
  • Subtipe baru yang terlewat akan menjadi kesalahan kompilasi.
  • case null menangani nilai kosong secara eksplisit.
  • Penjaga mempersempit kasus, tetapi tidak menggantikan kasus tanpa penjaga.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “switch Menyeluruh pada Sealed” gratis?

Ya — teks lengkap “switch Menyeluruh pada Sealed” 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 “switch Menyeluruh pada Sealed”?

Kelengkapan saat kompilasi. 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 “switch Menyeluruh pada Sealed” 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. Mendeklarasikan Tipe Sealed
  2. Klausa permits
  3. Sealed dengan Record
  4. switch Menyeluruh pada Sealed
← Kembali ke Java Academy