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

รูปแบบใน switch

ใช้ชนิดแบบปิดผนึกและรูปแบบร่วมกัน

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

รูปแบบในคำสั่งสวิตช์

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

รูปแบบชนิดในคำสั่งสวิตช์

แต่ละกรณีสามารถเป็นรูปแบบชนิดที่ผูกตัวแปรตามชนิดไว้สำหรับแขนงนั้น

public class Main {
    static String kind(Object o) {
        return switch (o) {
            case Integer i -> "int " + i;
            case String s -> "string " + s;
            default -> "other";
        };
    }

    public static void main(String[] args) {
        System.out.println(kind(42));
        System.out.println(kind("hi"));
        System.out.println(kind(3.14));
    }
}

ชนิดที่ปิดผนึกไม่ต้องใช้ default

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

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

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

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

รูปแบบเรคคอร์ดในกรณีต่าง ๆ

กรณีต่าง ๆ สามารถแยกโครงสร้างเรคคอร์ด เพื่อเปิดเผยองค์ประกอบให้ใช้ได้โดยตรงในเนื้อหาของแขนง

public class Main {
    sealed interface Shape permits Circle, Rectangle {}
    record Circle(double r) implements Shape {}
    record Rectangle(double w, double h) implements Shape {}

    static double area(Shape shape) {
        return switch (shape) {
            case Circle(double r) -> Math.PI * r * r;
            case Rectangle(double w, double h) -> w * h;
        };
    }

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

เงื่อนไขกำกับด้วย when

ส่วนคำสั่ง when จะเพิ่มเงื่อนไขกำกับแบบบูลีนให้กับกรณี กรณีนั้นจะจับคู่ได้ก็ต่อเมื่อรูปแบบตรงกันและเงื่อนไขกำกับเป็นจริง

public class Main {
    static String size(Object o) {
        return switch (o) {
            case Integer i when i < 0 -> "negative";
            case Integer i when i == 0 -> "zero";
            case Integer i -> "positive";
            default -> "not an int";
        };
    }

    public static void main(String[] args) {
        System.out.println(size(-5));
        System.out.println(size(0));
        System.out.println(size(7));
    }
}

ลำดับสำคัญเมื่อมีเงื่อนไขกำกับ

กรณีที่มีเงื่อนไขกำกับจะถูกพิจารณาจากบนลงล่าง กรณีที่มีเงื่อนไขกำกับและเฉพาะเจาะจงกว่าต้องอยู่ก่อนกรณีที่กว้างกว่าและไม่มีเงื่อนไขกำกับ มิฉะนั้นกรณีที่กว้างกว่าจะดักจับกรณีนั้นไป

การจัดการค่าว่าง

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

public class Main {
    static String label(String s) {
        return switch (s) {
            case null -> "missing";
            case "yes" -> "affirmative";
            default -> "other: " + s;
        };
    }

    public static void main(String[] args) {
        System.out.println(label(null));
        System.out.println(label("yes"));
        System.out.println(label("maybe"));
    }
}

รูปแบบที่ซ้อนกันในคำสั่งสวิตช์

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

public class Main {
    record Point(int x, int y) {}
    record Line(Point a, Point b) {}

    static String describe(Object o) {
        return switch (o) {
            case Line(Point(var x1, var y1), Point(var x2, var y2)) when x1 == x2 -> "vertical";
            case Line(Point a, Point b) -> "line";
            default -> "other";
        };
    }

    public static void main(String[] args) {
        System.out.println(describe(new Line(new Point(1, 0), new Point(1, 5))));
        System.out.println(describe(new Line(new Point(0, 0), new Point(2, 3))));
    }
}

คำสั่งและนิพจน์

คำสั่งสวิตช์แบบรูปแบบใช้ได้ทั้งเป็นนิพจน์ (ให้ค่าด้วย -> หรือ yield) และเป็นคำสั่ง กฎเรื่องความครอบคลุมครบถ้วนจะมีผลเมื่อสิ่งที่ใช้เลือกเป็นชนิดที่ปิดผนึก

แทนที่โค้ดแบบ Visitor

ชนิดที่ปิดผนึกร่วมกับคำสั่งสวิตช์แบบรูปแบบช่วยแทนที่รูปแบบ Visitor ที่ยืดยาวและชุดคำสั่งตรวจสอบชนิดที่ต่อกันหลายชั้น ด้วยการเลือกการทำงานที่กระชับและคอมไพเลอร์ตรวจสอบได้บนแบบจำลองแบบปิด

ตัวแปลภาษาที่สมบูรณ์

ตัวประเมินนิพจน์ที่ใช้แบบจำลองชนิดปิดผนึกและคำสั่งสวิตช์แบบรูปแบบ

public class Main {
    sealed interface Expr permits Num, Add, Mul {}
    record Num(int value) implements Expr {}
    record Add(Expr left, Expr right) implements Expr {}
    record Mul(Expr left, Expr right) implements Expr {}

    static int eval(Expr e) {
        return switch (e) {
            case Num(int v) -> v;
            case Add(Expr l, Expr r) -> eval(l) + eval(r);
            case Mul(Expr l, Expr r) -> eval(l) * eval(r);
        };
    }

    public static void main(String[] args) {
        Expr e = new Add(new Num(2), new Mul(new Num(3), new Num(4)));
        System.out.println(eval(e));
    }
}

ตรวจสอบความเข้าใจอย่างรวดเร็ว

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

สรุปทบทวน

คุณได้เรียนรู้รูปแบบในคำสั่งสวิตช์

  • กรณีต่าง ๆ สามารถเป็นรูปแบบชนิดและรูปแบบเรคคอร์ดพร้อมการแยกโครงสร้าง
  • ตัวเลือกชนิดปิดผนึกทำให้คำสั่งสวิตช์ครอบคลุมครบถ้วนโดยไม่ต้องใช้ default
  • เงื่อนไขกำกับ when ช่วยจำกัดกรณีให้เฉพาะเจาะจงขึ้น และลำดับมีความสำคัญ
  • case 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. การจับคู่รูปแบบสำหรับ instanceof
  2. รูปแบบเรคคอร์ด
  3. รูปแบบเรคคอร์ดซ้อน
  4. รูปแบบใน switch
← กลับไปที่ Java Academy