0Pricing
Java Academy · บทเรียน

switch แบบครบถ้วนบนชนิดแบบปิดผนึก

ตรวจสอบความครบถ้วนขณะคอมไพล์

switch แบบครบถ้วนบนชนิดแบบปิดผนึก เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

สวิตช์ที่ครอบคลุมทุกกรณี

เมื่อคุณใช้ switch กับชนิดแบบปิด คอมไพเลอร์จะรู้จักชนิดย่อยที่ได้รับอนุญาตทั้งหมด หากสวิตช์ของคุณครอบคลุมครบทุกชนิด สวิตช์นั้นจะ ครอบคลุมทุกกรณี และไม่จำเป็นต้องมีแขนงเริ่มต้น

สวิตช์แบบรูปแบบชนิด

นิพจน์สวิตช์สามารถจับคู่ตามชนิดขณะทำงานของค่าแบบปิดได้โดยใช้รูปแบบชนิด

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)));
    }
}

ไม่จำเป็นต้องมีกรณีเริ่มต้น

เนื่องจาก Circle และ Square เป็นชนิดย่อยที่ได้รับอนุญาตเพียงสองชนิด คอมไพเลอร์จึงยอมรับว่าสวิตช์นี้สมบูรณ์ การเพิ่ม default จะเป็นสิ่งซ้ำซ้อน

ความครบถ้วนขณะคอมไพล์

หากภายหลังคุณเพิ่มชนิดย่อยที่ได้รับอนุญาตชนิดใหม่แล้วลืมจัดการชนิดนั้น สวิตช์ที่ครอบคลุมทุกกรณีทุกแห่งจะ คอมไพล์ไม่ผ่าน วิธีนี้เปลี่ยนข้อผิดพลาดขณะทำงานทั้งประเภทให้กลายเป็นข้อผิดพลาดในการคอมไพล์

การคำนวณ Result

นิพจน์สวิตช์ที่ครอบคลุมทุกกรณีเหมาะอย่างยิ่งสำหรับยุบค่าให้เป็นผลลัพธ์ เช่น area

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)));
    }
}

คำสั่งสวิตช์กับนิพจน์สวิตช์

ความครอบคลุมทุกกรณีใช้กับนิพจน์ switch (นิพจน์ที่ให้ค่า) และคำสั่งสวิตช์ที่ใช้รูปแบบลูกศรกับชนิดแบบปิด คอมไพเลอร์จะบังคับให้ครอบคลุมทุกกรณี

การจัดการค่า null

โดยค่าเริ่มต้น สวิตช์ที่ทำงานกับข้อมูลอ้างอิงจะโยน NullPointerException หากค่าเป็น null คุณสามารถเพิ่มป้ายกำกับ case null เพื่อจัดการกรณีนี้อย่างชัดเจนได้

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)));
    }
}

เงื่อนไขกำกับไม่ทำลายความครอบคลุมทุกกรณี

คุณสามารถเพิ่มเงื่อนไขกำกับ when เพื่อปรับกรณีให้ละเอียดขึ้นได้ แต่กรณีที่มีเงื่อนไขกำกับเพียงอย่างเดียวจะยังไม่ถือว่าครอบคลุมชนิดนั้น คุณยังต้องมีกรณีที่ไม่มีเงื่อนไขกำกับสำหรับชนิดย่อยแต่ละชนิดเพื่อให้ครอบคลุมทุกกรณี

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)));
    }
}

การใช้สวิตช์กับคลาสแบบปิด

การครอบคลุมทุกกรณีในลักษณะเดียวกันนี้ใช้ได้กับคลาสแบบปิด ไม่ได้จำกัดอยู่เฉพาะอินเทอร์เฟซ

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)));
    }
}

เหตุใดจึงทรงพลัง

สวิตช์ที่ครอบคลุมทุกกรณีร่วมกับชนิดแบบปิดช่วยให้โค้ดปลอดภัยและพัฒนาต่อได้ง่าย ชุดกรณีต่าง ๆ ถูกบันทึกไว้ในที่เดียว และคอมไพเลอร์รับรองว่าคุณจะไม่พลาดกรณีใดเมื่อแบบจำลองเติบโตขึ้น

ตัวอย่างที่สมบูรณ์

ในตัวอย่างนี้ ชนิดผลลัพธ์แบบปิดถูกยุบเป็นข้อความโดยครอบคลุมทุกกรณี

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")));
    }
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเรื่องสวิตช์ที่ครอบคลุมทุกกรณีของคุณ

ทบทวน

คุณได้เรียนรู้การใช้สวิตช์ที่ครอบคลุมทุกกรณีกับชนิดแบบปิด

  • การจัดการชนิดย่อยที่ได้รับอนุญาตทั้งหมดทำให้สวิตช์ครอบคลุมทุกกรณี จึงไม่จำเป็นต้องมี default
  • การพลาดชนิดย่อยใหม่จะกลายเป็นข้อผิดพลาดในการคอมไพล์
  • case null ใช้จัดการค่า null อย่างชัดเจน
  • เงื่อนไขกำกับช่วยปรับกรณีให้ละเอียดขึ้น แต่ไม่สามารถแทนที่กรณีที่ไม่มีเงื่อนไขกำกับได้

คำถามที่พบบ่อย

บทเรียน “switch แบบครบถ้วนบนชนิดแบบปิดผนึก” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “switch แบบครบถ้วนบนชนิดแบบปิดผนึก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “switch แบบครบถ้วนบนชนิดแบบปิดผนึก”

ตรวจสอบความครบถ้วนขณะคอมไพล์ คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “switch แบบครบถ้วนบนชนิดแบบปิดผนึก” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การประกาศชนิดแบบปิดผนึก
  2. ส่วนคำสั่ง permits
  3. ชนิดแบบปิดผนึกกับเรคคอร์ด
  4. switch แบบครบถ้วนบนชนิดแบบปิดผนึก
← กลับไปที่ Java Academy