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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การประกาศชนิดแบบปิดผนึก
- ส่วนคำสั่ง permits
- ชนิดแบบปิดผนึกกับเรคคอร์ด
- switch แบบครบถ้วนบนชนิดแบบปิดผนึก